27.7.6.77 mysql_use_result()

MYSQL_RES *mysql_use_result(MYSQL *mysql)

Description

调用mysql_query()mysql_real_query()之后,必须为成功生成结果集的每个语句(SELECTSHOWDESCRIBEEXPLAINCHECK 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 服务器已经消失了。

在查询期间与服务器的连接已丢失。

出现未知错误。