MYSQL_RES *
mysql_use_result(MYSQL *mysql)
在調用 mysql_real_query()
或 mysql_query()
之後,您必須針對每個成功產生結果集的語句,調用 mysql_store_result()
或 mysql_use_result()
(SELECT
、SHOW
、DESCRIBE
、EXPLAIN
、CHECK TABLE
等)。在您完成結果集的使用後,也必須調用 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_use_result()
返回的結果使用 mysql_data_seek()
、mysql_row_seek()
、mysql_row_tell()
、mysql_num_rows()
或 mysql_affected_rows()
,而且在 mysql_use_result()
完成之前,您也不得發出其他查詢。(但是,在您擷取所有列後,mysql_num_rows()
會準確返回擷取的列數。)
在您完成結果集的使用後,必須調用 mysql_free_result()
。
如果 mysql_use_result()
成功,則會重置 mysql_error()
和 mysql_errno()
。
-
命令以不正確的順序執行。
-
記憶體不足。
-
MySQL 伺服器已關閉。
-
查詢期間與伺服器的連線中斷。
-
發生不明的錯誤。