基於 VS2008 驗證的 MySQL C API 完整範例,涵蓋初始化、連線、字符集設定、單/多語句執行、結果集逐行讀取、錯誤處理與資源釋放,可直接作為專案參考基礎。
mysql_init() 初始化 MYSQL 結構體。mysql_real_connect() 建立連線,最後一個參數傳 CLIENT_MULTI_STATEMENTS 啟用多語句。mysql_query() 執行 SET NAMES gbk 設定字符集。mysql_store_result() 取得結果集指標。mysql_fetch_row() 逐行讀取,mysql_num_fields() 取欄位數。do { ... } while (mysql_next_result() == 0) 遍歷所有結果集。mysql_free_result()、mysql_close() 釋放資源。MYSQL mydata;
mysql_init(&mydata);
mysql_real_connect(&mydata, "127.0.0.1", "root", "root", "im", 3306, NULL, CLIENT_MULTI_STATEMENTS);
mysql_query(&mydata, "SET NAMES gbk");
// 單一查詢
mysql_query(&mydata, "SHOW DATABASES");
MYSQL_RES *res = mysql_store_result(&mydata);
process_result_set(mydata, res);
mysql_free_result(res);
// 多語句批次
char *multi = "INSERT ...; INSERT ...; SELECT * FROM fangl.admin";
mysql_query(&mydata, multi);
do {
res = mysql_store_result(&mydata);
if (res) {
process_result_set(mydata, res);
mysql_free_result(res);
} else if (mysql_field_count(&mydata) == 0) {
printf("%lld rows affected\n", mysql_affected_rows(&mydata));
}
} while (mysql_next_result(&mydata) == 0);
mysql_close(&mydata);
void process_result_set(MYSQL mydata, MYSQL_RES *result) {
MYSQL_FIELD *field;
// 印欄位名
while ((field = mysql_fetch_field(result))) printf("%s ", field->name);
printf("\n");
// 印資料行
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
for (int i = 0; i < mysql_num_fields(result); ++i)
printf("%s ", row[i] ? row[i] : "NULL");
printf("\n");
}
}
SET NAMES,否則中文亂碼。mysql_free_result()。mysql_error(&mydata) 取得詳細訊息。此範例在 Windows/VS2008 編譯通過,Linux 下僅需調整標頭檔路徑與連結庫即可移植。