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 会给出错误 命令不同步;您现在不能运行此命令!
您不能将 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 服务器已断开连接。
-
在查询期间与服务器的连接丢失。
-
发生未知错误。