MYSQL_RES *
mysql_use_result(MYSQL *mysql)
在调用 mysql_real_query()
或 mysql_query()
之后,您必须为每个成功生成结果集(SELECT
、SHOW
、DESCRIBE
、EXPLAIN
、CHECK TABLE
等)的语句调用 mysql_store_result()
或 mysql_use_result()
。在使用完结果集后,还必须调用 mysql_free_result()
。
mysql_use_result()
初始化结果集检索,但实际上并不像 mysql_store_result()
那样将结果集读取到客户端。相反,必须通过调用 mysql_fetch_row()
单独检索每一行。这会直接从服务器读取查询结果,而无需将其存储在临时表或本地缓冲区中,这比 mysql_store_result()
快一些,并且使用的内存少得多。客户端只为当前行和一个通信缓冲区分配内存,该缓冲区最多可以增长到 max_allowed_packet
字节。
另一方面,如果您在客户端对每一行进行大量处理,或者输出发送到用户可以在其上键入 ^S
(停止滚动)的屏幕上,则不应将 mysql_use_result()
用于锁定读取。这会占用服务器资源,并阻止其他线程更新正在从中获取数据的任何表。
使用 mysql_use_result()
时,必须执行 mysql_fetch_row()
直到返回 NULL
值,否则,未获取的行将作为下一个查询的结果集的一部分返回。如果您忘记这样做,C API 会给出错误 Commands out of sync; you can't run this command now
!
您不能将 mysql_data_seek()
、mysql_row_seek()
、mysql_row_tell()
、mysql_num_rows()
或 mysql_affected_rows()
与 mysql_use_result()
返回的结果一起使用,也不能在 mysql_use_result()
完成之前发出其他查询。(但是,在获取所有行之后,mysql_num_rows()
会准确返回获取的行数。)
使用完结果集后,必须调用 mysql_free_result()
。
如果 mysql_use_result()
成功,它会重置 mysql_error()
和 mysql_errno()
。
-
命令执行顺序不正确。
-
内存不足。
-
MySQL 服务器已关闭。
-
查询期间与服务器的连接断开。
-
发生未知错误。