mysql資料庫C API函式mysql_store_result和mysql_use_result的區別

readyao發表於2016-02-12

mysql_store_result()

1、mysql_store_result(&mysql)告訴控制程式碼mysql,把查詢的資料從伺服器端取到客戶端,然後快取起來,放在控制程式碼mysql裡面;

2、mysql_store_result()將查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,並將結果置於該結構中。(獲得全部的查詢結果)

MYSQL_RES *mysql_store_result(MYSQL *mysql) 

描述

對於成功檢索了資料的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必須呼叫mysql_store_result()或mysql_use_result() 。

對於其他查詢,不需要呼叫mysql_store_result()或mysql_use_result(),但是如果在任何情況下均呼叫了mysql_store_result(),它也不會導致任何傷害或效能降低。通過檢查mysql_store_result()是否返回0,可檢測查詢是否沒有結果集(以後會更多)。

如果希望瞭解查詢是否應返回結果集,可使用mysql_field_count()進行檢查。請參見25.2.3.22節,“mysql_field_count()”。

mysql_store_result()將查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,並將結果置於該結構中。

如果查詢未返回結果集,mysql_store_result()將返回Null指標(例如,如果查詢是INSERT語句)。

如果讀取結果集失敗,mysql_store_result()還會返回Null指標。通過檢查mysql_error()是否返回非空字串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以檢查是否出現了錯誤。

如果未返回行,將返回空的結果集。(空結果集設定不同於作為返回值的空指標)。

一旦呼叫了mysql_store_result()並獲得了不是Null指標的結果,可呼叫mysql_num_rows()來找出結果集中的行數。

可以呼叫mysql_fetch_row()來獲取結果集中的行,或呼叫mysql_row_seek()和mysql_row_tell()來獲取或設定結果集中的當前行位置。

一旦完成了對結果集的操作,必須呼叫mysql_free_result()。

請參見25.2.13.1節,“為什麼在mysql_query()返回成功後,mysql_store_result()有時會返回NULL”. 

返回值

具有多個結果的MYSQL_RES結果集合。如果出現錯誤,返回NULL。 

錯誤

如果成功,mysql_store_result()將復位mysql_error()和mysql_errno()。

·         CR_COMMANDS_OUT_OF_SYNC 

以不恰當的順序執行了命令。 

·         CR_OUT_OF_MEMORY 

記憶體溢位。 

·         CR_SERVER_GONE_ERROR 

MySQL伺服器不可用。 

·         CR_SERVER_LOST 

在查詢過程中,與伺服器的連線丟失。 

·         CR_UNKNOWN_ERROR 

出現未知錯誤。 


mysql_use_result()


1、mysql_use_result(&mysql)不是將查詢的資料從伺服器端取到客戶端,然後快取起來;而是每次需要讀取的時候再從伺服器端讀取;

2、使用mysql_use_result()時,必須執行mysql_fetch_row(),直至返回NULL值;一旦完成了對結果集的操作,必須呼叫mysql_free_result()。

3、mysql_use_result()將初始化結果集檢索,但並不像mysql_store_result()那樣將結果集實際讀取到客戶端。它必須通過對mysql_fetch_row()的呼叫,對每一行分別進行檢索。這將直接從伺服器讀取結果,而不會將其儲存在臨時表或本地緩衝區內,與mysql_store_result()相比,速度更快而且使用的記憶體也更少。


MYSQL_RES *mysql_use_result(MYSQL *mysql) 

描述

對於成功檢索資料的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN),必須呼叫mysql_store_result()或mysql_use_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給出命令不同步錯誤,如果忘記了執行該操作,將不能執行該命令。

不應與從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()。

使用libmysqld嵌入式伺服器時,由於在呼叫mysql_free_result()之前,記憶體使用將隨著每個檢索的行增加,記憶體效益將基本喪失。

返回值

MYSQL_RES結果結構。如果出現錯誤,返回NULL。 

錯誤

如果成功,mysql_use_result()將復位mysql_error()和mysql_errno()。

·         CR_COMMANDS_OUT_OF_SYNC 

以不恰當的順序執行了命令。 

·         CR_OUT_OF_MEMORY 

記憶體溢位。 

·         CR_SERVER_GONE_ERROR 

MySQL伺服器不可用。 

·         CR_SERVER_LOST 

在查詢過程中,與伺服器的連線丟失。 

·         CR_UNKNOWN_ERROR 

出現未知錯誤。 

相關文章