27.7.6.77 mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql)
Description
调用mysql_query()或mysql_real_query()之后,必须为成功生成结果集的每个语句(SELECT,SHOW,DESCRIBE,EXPLAIN,CHECK TABLE等等)调用mysql_store_result()或mysql_use_result()。完成结果集后,还必须调用mysql_free_result()。
mysql_use_result()启动结果集检索,但实际上没有像mysql_store_result()一样将结果集读入 Client 端。相反,必须通过调用mysql_fetch_row()单独检索每一行。这直接从服务器读取查询结果,而不将其存储在临时 table 或本地缓冲区中,这比mysql_store_result()更快,并且使用的内存更少。Client 端仅为当前行分配内存,并为最大可扩展到max_allowed_packet字节的通信缓冲区分配内存。
另一方面,如果您要对 Client 端的每一行进行大量处理,或者如果输出发送到用户可以在其上键入^S
的屏幕(停止滚动),则不应使用mysql_use_result()锁定读取。 。这将束缚服务器,并防止其他线程更新正在从中获取数据的任何 table。
使用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()。
当使用libmysqld
嵌入式服务器时,由于在每次调用mysql_free_result()之前检索到的每一行,内存使用量都会逐渐增加,因此内存的好处实际上就丧失了。
Return Values
MYSQL_RES
结果结构。 NULL
(如果发生错误)。
Errors
mysql_use_result()成功重置mysql_error()和mysql_errno()。
命令执行 Sequences 不正确。
记不清。
MySQL 服务器已经消失了。
在查询期间与服务器的连接已丢失。
出现未知错误。