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. 如果语句是a选择或任何其他产生结果集的语句,调用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. 如果你得到一个选择语句的结果集元数据mysql_stmt_result_metadata (),您还应该使用释放元数据mysql_free_result ()

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

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

  • 客户端使用这个语句ID进行进一步的操作,这样服务器就可以从它的语句池中识别该语句。

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

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

  • 服务器使用客户端提供的ID标识语句,用新提供的数据替换参数标记,并执行语句。如果语句生成结果集,服务器将数据发送回客户端。否则,它将发送一个ok状态以及更改、删除或插入的行数。

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

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

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

预估报表日志

方法执行的预处理语句mysql_stmt_prepare ()而且mysql_stmt_execute ()C API函数,服务器写准备而且执行到一般查询日志的行,以便您可以知道何时准备和执行语句。

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

  1. 调用mysql_stmt_prepare ()来准备语句字符串“选择?”

  2. 调用mysql_stmt_bind_param ()绑定值3.转换为预处理语句中的参数。

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

作为上述调用的结果,服务器将以下行写到通用查询日志中:

准备[1]SELECT ?执行[1]SELECT 3

每一个准备而且执行日志中的行标记为N语句标识符,以便您可以跟踪正在记录的准备语句。N为正整数。如果有多个准备好的语句同时为客户端活动,N可能大于1。每一个执行的数据值替换后的预处理语句?参数。