文件首頁
MySQL 8.4 C API 開發人員指南
下載本手冊
PDF (美式信紙) - 1.4Mb
PDF (A4) - 1.4Mb


MySQL 8.4 C API 開發人員指南  /  C API 基本介面  /  C API 基本介面概觀

5.1 C API 基本介面概觀

應用程式應使用此通用大綱,透過用戶端程式庫與 MySQL 互動

  1. 透過呼叫 mysql_library_init() 初始化 MySQL 用戶端程式庫。

  2. 透過呼叫 mysql_init() 初始化連線處理常式,並透過呼叫連線建立函式(例如 mysql_real_connect())連線至伺服器。

  3. 發出 SQL 陳述式並處理其結果。(以下討論提供關於如何執行此操作的更多資訊。)

  4. 透過呼叫 mysql_close() 關閉與 MySQL 伺服器的連線。

  5. 透過呼叫 mysql_library_end() 結束使用 MySQL 用戶端程式庫。

呼叫 mysql_library_init()mysql_library_end() 的目的是為了正確初始化和完成 MySQL 用戶端程式庫。對於與用戶端程式庫連結的應用程式,它們提供改進的記憶體管理。如果您不呼叫 mysql_library_end(),則會保留一個記憶體區塊的配置。(這不會增加應用程式使用的記憶體量,但某些記憶體洩漏偵測器會抱怨它。)

在非多執行緒環境中,可以省略呼叫 mysql_library_init(),因為 mysql_init() 會在必要時自動呼叫它。但是,mysql_library_init() 在多執行緒環境中不是執行緒安全的,因此呼叫 mysql_library_init()mysql_init() 也不是執行緒安全的。您必須在產生任何執行緒之前呼叫 mysql_library_init(),或者使用互斥鎖來保護呼叫,無論您是直接呼叫 mysql_library_init() 或間接透過 mysql_init() 呼叫。這應該在任何其他用戶端程式庫呼叫之前完成。

若要連線到伺服器,請呼叫 mysql_init() 以初始化連線處理常式,然後呼叫連線建立函式(例如 mysql_real_connect())以及該處理常式(以及其他資訊,例如主機名稱、使用者名稱和密碼)。當您完成連線時,請呼叫 mysql_close() 以終止連線。請勿在關閉處理常式後使用它。

連線時,mysql_real_connect() 會將 reconnect 旗標(MYSQL 結構的一部分)設定為值 0。您可以使用 MYSQL_OPT_RECONNECT 選項(已棄用)透過 mysql_options() 控制重新連線行為。如果因為連線遺失而無法執行陳述式,將旗標設定為 1 會導致用戶端嘗試重新連線至伺服器,然後才放棄。

注意

自動重新連線功能(第 3.6.8 節,「自動重新連線控制」)已棄用,並可能在 MySQL 的未來版本中移除。

當連線處於作用中時,用戶端可以使用 mysql_real_query()mysql_query() 將 SQL 陳述式傳送至伺服器。兩者之間的差異在於 mysql_query() 預期查詢會指定為以 Null 結尾的字串,而 mysql_real_query() 預期為計數的字串。如果字串包含二進位資料(可能包含 Null 位元組),您必須使用 mysql_real_query()

對於每個非 SELECT 查詢(例如,INSERTUPDATEDELETE),您可以呼叫 mysql_affected_rows() 來找出有多少列已變更(影響)。

對於 SELECT 查詢,您可以擷取選取的列作為結果集。(請注意,某些陳述式類似於 SELECT,因為它們會傳回列。這些包括 SHOWDESCRIBEEXPLAIN。將這些陳述式視為與 SELECT 陳述式相同。)

用戶端可以透過兩種方式來處理結果集。一種方式是透過呼叫 mysql_store_result() 一次擷取整個結果集。此函式從伺服器取得查詢傳回的所有列,並將它們儲存在用戶端中。第二種方式是讓用戶端透過呼叫 mysql_use_result() 來起始逐列結果集擷取。此函式會初始化擷取,但實際上不會從伺服器取得任何列。

在這兩種情況下,您都可以透過呼叫 mysql_fetch_row() 來存取列。使用 mysql_store_result()mysql_fetch_row() 會存取先前從伺服器擷取的列。使用 mysql_use_result()mysql_fetch_row() 實際上會從伺服器擷取列。您可以呼叫 mysql_fetch_lengths() 來取得關於每列資料大小的資訊。

在您完成結果集後,請呼叫 mysql_free_result() 以釋放用於它的記憶體。

這兩種擷取機制是互補的。選擇最適合每個用戶端應用程式的方法。實際上,用戶端傾向於更常使用 mysql_store_result()

mysql_store_result() 的一個優點是,由於所有資料列都已提取到客戶端,您不僅可以依序存取資料列,還可以使用 mysql_data_seek()mysql_row_seek() 在結果集中前後移動,以變更結果集內目前的資料列位置。您還可以透過呼叫 mysql_num_rows() 來找出有多少資料列。另一方面,對於大型結果集,mysql_store_result() 的記憶體需求可能非常高,您更容易遇到記憶體不足的情況。

mysql_use_result() 的一個優點是,客戶端對結果集所需的記憶體較少,因為它一次只維護一個資料列(而且由於分配額外開銷較少,mysql_use_result() 可能會更快)。缺點是您必須快速處理每個資料列,以避免佔用伺服器,您無法隨機存取結果集內的資料列(您只能依序存取資料列),而且在您擷取所有資料列之前,結果集中的資料列數目是未知的。此外,即使您在擷取過程中確定已找到所需的資訊,您必須擷取所有資料列。

該 API 使客戶端能夠適當地回應陳述式(僅在必要時擷取資料列),而無需知道該陳述式是否為 SELECT。您可以在每次 mysql_real_query()(或 mysql_query())之後呼叫 mysql_store_result() 來做到這一點。如果結果集呼叫成功,則該陳述式為 SELECT,您可以讀取資料列。如果結果集呼叫失敗,則呼叫 mysql_field_count() 以確定是否確實預期會有結果。如果 mysql_field_count() 傳回零,則該陳述式未傳回任何資料(表示該陳述式為 INSERTUPDATEDELETE 等等),且不應傳回資料列。如果 mysql_field_count() 非零,則該陳述式應已傳回資料列,但未傳回。這表示該陳述式為失敗的 SELECT。請參閱 mysql_field_count() 的說明,以瞭解如何執行此操作的範例。

mysql_store_result()mysql_use_result() 都讓您能夠取得構成結果集的欄位相關資訊(欄位數、其名稱和類型等等)。您可以透過重複呼叫 mysql_fetch_field(),依序存取資料列內的欄位資訊,或透過呼叫 mysql_fetch_field_direct(),依資料列內的欄位編號存取。可以透過呼叫 mysql_field_seek() 來變更目前的欄位游標位置。設定欄位游標會影響後續對 mysql_fetch_field() 的呼叫。您也可以透過呼叫 mysql_fetch_fields() 一次取得所有欄位的資訊。

為了偵測和回報錯誤,MySQL 提供透過 mysql_errno()mysql_error() 函式存取錯誤資訊的方式。這些函式會傳回最近一次呼叫的成功或失敗函式的錯誤代碼或錯誤訊息,使您能夠判斷何時發生錯誤以及錯誤是什麼。