MySQL 8.0 C API 开发者指南  / 第 6 章 C API 预处理语句接口  /  6.1 C API 预处理语句接口概述

6.1 C API 预处理语句接口概述

要准备和执行语句,应用程序遵循以下步骤:

  1. 使用 .创建准备好的语句处理程序 mysql_stmt_init()。要在服务器上准备语句,调用 mysql_stmt_prepare()并传递一个包含 SQL 语句的字符串。

  2. 使用 设置任何参数的值 mysql_stmt_bind_param()。必须设置所有参数。否则,语句执行会返回错误或产生意外结果。

    如果要发送大文本或二进制数据值,您可以使用 mysql_stmt_send_long_data().

  3. 调用mysql_stmt_execute()以执行语句。

  4. 如果该语句是一个SELECT或任何其他生成结果集的语句, mysql_stmt_result_metadata() 则在需要获取结果集元数据时调用。此元数据本身采用 MYSQL_RES结果集的形式,尽管与包含查询返回的行的结果集不同。元数据结果集指示结果中的列数并包含有关每一列的信息。

  5. 如果语句生成结果集,则通过调用绑定数据缓冲区以用于检索行值 mysql_stmt_bind_result()

  6. 通过重复调用逐行将数据提取到缓冲区中, mysql_stmt_fetch()直到找不到更多行。

  7. 根据需要重复步骤 3 到 6。您可以重复 mysql_stmt_execute()以通过更改通过 提供的相应缓冲区中的参数值来重新执行该语句 mysql_stmt_bind_param()

  8. 语句执行完成后,关闭语句处理程序, mysql_stmt_close()以便释放与其关联的所有资源。那时处理程序变得无效,不应再使用。

  9. SELECT 如果您通过调用 获得语句的结果集元数据mysql_stmt_result_metadata(),您还应该使用释放元数据 mysql_free_result()

mysql_stmt_prepare()调用时,MySQL 客户端/服务器协议执行以下操作 :

  • 服务器解析语句并通过分配语句 ID 将 okay 状态发送回客户端。如果它是面向结果集的语句,它还会发送参数总数、列计数及其元数据。在此调用期间,服务器会检查语句的所有语法和语义。

  • 客户端使用此语句 ID 进行进一步的操作,以便服务器可以从其语句池中识别该语句。

mysql_stmt_execute()调用时,MySQL 客户端/服务器协议执行以下操作 :

  • 客户端使用语句处理程序并将参数数据发送到服务器。

  • 服务器使用客户端提供的 ID 识别语句,用新提供的数据替换参数标记,然后执行语句。如果该语句产生结果集,则服务器将数据发送回客户端。否则,它会发送 okay 状态和更改、删除或插入的行数。

mysql_stmt_fetch()调用时,MySQL 客户端/服务器协议执行以下操作 :

  • 客户端从结果集的当前行读取数据,并通过进行必要的转换将其放入应用程序数据缓冲区。如果应用程序缓冲区类型与从服务器返回的字段类型相同,则转换很简单。

如果发生错误,您可以分别使用 mysql_stmt_errno()mysql_stmt_error()、 和 获取语句错误号、错误消息和SQLSTATE代码mysql_stmt_sqlstate()

准备好的语句记录

mysql_stmt_prepare()对于使用 C API 函数和 C API 函数 执行的准备好的语句, 服务器 mysql_stmt_execute()会将行写入一般查询日志,以便您可以知道何时准备和执行语句。 PrepareExecute

假设您准备并执行如下语句:

  1. 调用mysql_stmt_prepare()以准备语句字符串"SELECT ?"

  2. 调用mysql_stmt_bind_param() 以将值绑定3到准备好的语句中的参数。

  3. 调用mysql_stmt_execute()以执行准备好的语句。

作为前面调用的结果,服务器将以下行写入一般查询日志:

Prepare  [1] SELECT ?
Execute  [1] SELECT 3

Prepare日志中的 每一Execute 行都标有 语句标识符,以便您可以跟踪正在记录哪个准备好的语句。是一个正整数。如果客户端有多个准备好的语句同时处于活动状态, 则可能大于 1。每 行显示一个准备好的语句在替换 参数的数据值之后。 [N]NNExecute?