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 伺服器已關閉。
-
查詢期間與伺服器的連線中斷。
-
發生不明的錯誤。