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