mysql資料庫C API函式mysql_store_result和mysql_use_result的區別
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
出現未知錯誤。
相關文章
- strcpy函式和memcpy函式的區別函式memcpy
- fill函式與memset函式的區別(c++)函式C++
- StretchBlt函式和BitBlt函式的區別和用法函式
- # 普通函式和箭頭函式的區別函式
- MySQL資料庫中的分組函式ROLLUPMySql資料庫函式
- 瀚高資料庫相容Mysql的unhex函式資料庫MySql函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- 資料型別與函式索引-MySQL篇資料型別函式索引MySql
- 簡述箭頭函式和普通函式的區別函式
- 箭頭函式和普通函式的10個區別函式
- JavaScript方法和函式區別JavaScript函式
- Java分散式鎖方案和區別 - Redis,Zookeeper,資料庫Java分散式Redis資料庫
- Python中函式和方法的區別Python函式
- C與C++在函式和資料的比較C++函式
- dg和ogg的區別--oracle資料庫Oracle資料庫
- 資料庫中modify和change的區別資料庫
- mysql資料庫date 、datetime、time、timestamp區別MySql資料庫
- 區塊鏈代表的資料庫和傳統資料庫有何區別區塊鏈資料庫
- Day 59/100 箭頭函式和普通函式的區別函式
- 面試題:箭頭函式和普通函式的區別面試題函式
- MySQL-日期和資料處理函式MySql函式
- 例項物件和函式物件的區別物件函式
- 深入理解箭頭函式和傳統函式的區別函式
- python中的str和repr函式的區別Python函式
- 資料庫和資料倉儲的區別在哪兒?CN資料庫
- mysql資料庫如何使用concat函式連線字串MySql資料庫函式字串
- 關係型資料庫和非關係型資料庫的區別資料庫
- 雲原生資料庫TDSQL-C和傳統主備方式資料庫有什麼區別?資料庫SQL
- SDK和API的區別?API
- 主流關聯式資料庫鎖實現的區別資料庫
- 箭頭函式、簡寫函式、普通函式的區別函式
- 建構函式與普通函式的區別函式
- 箭頭函式與普通函式的區別函式
- 原生分散式資料庫與子資料庫子表中介軟體的區別分散式資料庫
- 【從零開始學習 MySql 資料庫】(2) 函式MySql資料庫函式
- Serverless 解惑——函式計算如何訪問 MySQL 資料庫Server函式MySql資料庫
- C 庫函式 - strstr()函式
- MySQL資料庫中timediff()函式,在瀚高資料庫中如何替換使用?MySql資料庫函式
- python內建函式-eval()函式與exec()函式的區別Python函式