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


MySQL 9.0 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() 函式來存取錯誤資訊的方法。這些函式會傳回最近調用的可能成功或失敗函式的錯誤碼或錯誤訊息,使您能夠確定何時發生錯誤以及錯誤是什麼。