第25章:API和库 / 25.2. MySQL C API / 25.2.6. C API预处理语句函数概述

在此归纳了预处理语句处理功能可使用的函数,并在后面的章节中详细介绍了它。请参见25.2.7节,“C API预处理语句函数描述”

函数

描述

mysql_stmt_affected_rows()

返回由预处理语句UPDATEDELETEINSERT变更、删除或插入的行数目。

mysql_stmt_attr_get()

获取预处理语句属性的值。

mysql_stmt_attr_set()

设置预处理语句的属性。

mysql_stmt_bind_param()

将应用程序数据缓冲与预处理SQL语句中的参数标记符关联起来。

mysql_stmt_bind_result()

将应用程序数据缓冲与结果集中的列关联起来。

mysql_stmt_close()

释放预处理语句使用的内存。

mysql_stmt_data_seek()

寻找语句结果集中的任意行编号。

mysql_stmt_errno()

返回上次语句执行的错误编号。

mysql_stmt_error()

返回上次语句执行的错误消息。

mysql_stmt_execute()

执行预处理语句。

mysql_stmt_fetch()

从结果集获取数据的下一行,并返回所有绑定列的数据。

mysql_stmt_fetch_column()

获取结果集当前行中某列的数据。

mysql_stmt_field_count()

对于最近的语句,返回结果行的数目。

mysql_stmt_free_result()

释放分配给语句句柄的资源。

mysql_stmt_init()

MYSQL_STMT结构分配内存并初始化它

mysql_stmt_insert_id()

对于预处理语句的AUTO_INCREMENT列,返回生成的ID

mysql_stmt_num_rows()

从语句缓冲结果集返回总行数。

mysql_stmt_param_count()

返回预处理SQL语句中的参数数目。

mysql_stmt_param_metadata()

返回结果集的参数元数据。

mysql_stmt_prepare()

为执行操作准备SQL字符串。

mysql_stmt_reset()

复位服务器中的语句缓冲区。

mysql_stmt_result_metadata()

以结果集形式返回预处理语句元数据。

mysql_stmt_row_seek()

使用从mysql_stmt_row_tell()返回的值,查找语句结果集中的行偏移。

mysql_stmt_row_tell()

返回语句行光标位置。

mysql_stmt_send_long_data()

将程序块中的长数据发送到服务器。

mysql_stmt_sqlstate()

返回关于上次语句执行的SQLSTATE错误代码。

mysql_stmt_store_result()

将完整的结果集检索到客户端。

调用mysql_stmt_init()以创建语句句柄,然后调用mysql_stmt_prepare准备语句,调用mysql_stmt_bind_param()提供参数数据,并调用mysql_stmt_execute()执行语句。通过更改mysql_stmt_bind_param()提供的相应缓冲区中的参数值,可重复执行mysql_stmt_execute()

如果语句是SELECT或任何其他能生成结果集的语句,mysql_stmt_prepare()也会通过mysql_stmt_result_metadata()MYSQL_RES结果集的形式返回结果集元数据信息。

你可以使用mysql_stmt_bind_result()提供结果缓冲,以便mysql_stmt_fetch()能自动将数据返回给这些缓冲。这是一种按行获取方式。

此外,你也能使用mysql_stmt_send_long_data()将程序块中的文本或二进制数据发送到服务器。请参见mysql_stmt_send_long_data()">25.2.7.25节,“mysql_stmt_send_long_data()”。

完成语句执行后,必须使用mysql_stmt_close()关闭语句句柄,以便与之相关的所有资源均能被释放。

如果通过调用mysql_stmt_result_metadata()获得了SELECT语句的结果集元数据,也应使用mysql_free_result()释放元数据。

执行步骤

要想准备和执行语句,应用程序必须采取下述步骤:

1.    msyql_stmt_init()创建预处理语句句柄。要想在服务器上准备预处理语句,可调用mysql_stmt_prepare(),并为其传递包含SQL语句的字符串。

2.    如果语句生成了结果集,调用mysql_stmt_result_metadata()以获得结果集元数据。虽然与包含查询返回列的结果集不同,该元数据本身也采用了结果集的形式。元数据结果集指明了结果中包含多少列,并包含每一列的信息。

3.    使用mysql_stmt_bind_param()设置任何参数的值。必须设置所有参数。否则,语句执行将返回错误,或生成无法预料的结果。

4.    调用mysql_stmt_execute()执行语句。

5.    如果语句生成了结果集,捆绑数据缓冲,通过调用mysql_stmt_bind_result(),检索行值。

6.    通过重复调用mysql_stmt_fetch(),按行将数据提取到缓冲区,直至未发现更多行为止。

7.    通过更改参数值并再次执行语句,重复步骤3到步骤6

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

·         服务器解析语句,并通过赋值语句IDOK状态发回客户端。此外,如果它是面向结果集的语句,还将发送总的参数数目,列计数和元数据。在此调用过程中,服务器将检查语句的所有语法和语义。

·         客户端采用该语句ID用于进一步操作,以便服务器能从其语句池中识别语句。

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

·         客户端使用语句句柄,并将参数数据发送到服务器。

·         服务器使用由客户端提供的ID来识别语句,用新提供的数据替换参数标记符,并执行语句。如果语句生成了结果集,服务器将数据发回客户端。否则,服务器会将发送OK状态,以及总的变更、删除和插入行数。

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

·         客户端按行从信息包读取数据,并通过执行必要的转换操作将其放入应用程序数据缓冲中。如果应用程序的缓冲类型与服务器返回的字段类型相同,转换十分简明。

如果出现了错误,可分别使用mysql_stmt_errno()mysql_stmt_error()mysql_stmt_sqlstate()获取语句错误代码、错误消息和SQLSTATE值。

预处理语句日志功能

对于与mysql_stmt_prepare()mysql_stmt_execute() C API函数一起执行的预处理语句,服务器会将“准备”和“执行”行写入一般查询日志,以便你能了解语句是在何时准备和执行的。

假定按下述方式准备和执行了语句:

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

2.    调用mysql_stmt_bind_param()将值“3”绑定到预处理语句中的参数。

3.    调用mysql_stmt_execute(),执行预处理语句。

上述调用的结果是,服务器将下述行写入一般查询日志:

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

日志中的每个“准备”和“执行”行均具有[n]语句ID标识,这样,你就能跟踪已记录的预处理语句。N是正整数。对于客户端,如果同时有多个活动的预处理语句,n可能会大于1。替换了“?”参数的数据值后,每个“执行”行将显示一条预处理语句。

版本说明:在MySQL 4.1.10之前,显示的“准备”行无[n]标识。在MySQL 4.1.10之前,不显示“执行”行。