Visual Studio MFC 專案若需原生高效操作 MySQL,官方提供的 C API(libmysql.dll)是輕量且穩定的選擇。本文記錄從專案屬性配置、核心 API 封裝到 CRUD 範例的完整落地步驟。
include 資料夾(如 C:\Program Files\MySQL\MySQL Server 5.6\include)。lib 資料夾(如 C:\Program Files\MySQL\MySQL Server 5.6\lib)。libmysql.lib。#pragma comment(lib, "libmysql.lib")。libmysql.dll 複製到專案輸出目錄(Debug/Release)或系統 PATH 目錄,否則執行時會報「找不到 libmysql.dll」。#include <winsock2.h> // 必須在 windows.h 之前,網路通訊依賴
#include <mysql.h>
#pragma comment(lib, "libmysql.lib")
#pragma comment(lib, "ws2_32.lib") // 連結 Winsock
MYSQL mysql;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,
"localhost", // 主機/IP
"root", // 用戶
"123", // 密碼
"test", // 資料庫
3306, // Port
NULL, 0)) {
AfxMessageBox(_T("資料庫連接失敗: ") + CString(mysql_error(&mysql)));
return FALSE;
}
AfxMessageBox(_T("資料庫連接成功!"));
// 設定字元集,解決中文亂碼
mysql_query(&mysql, "SET NAMES 'GB2312'"); // 或 utf8mb4
if (mysql_real_query(&mysql, "SELECT * FROM 物料屬性", strlen("SELECT * FROM 物料屬性"))) {
AfxMessageBox(_T("查詢失敗: ") + CString(mysql_error(&mysql)));
return;
}
MYSQL_RES* res = mysql_store_result(&mysql);
if (!res) return;
int cols = mysql_num_fields(res);
int rowIdx = 0;
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
for (int c = 0; c < cols; ++c) {
CString val(row[c] ? row[c] : _T(""));
if (c == 0) m_list.InsertItem(rowIdx, val);
else m_list.SetItemText(rowIdx, c, val);
}
++rowIdx;
}
mysql_free_result(res);
// 清空表
mysql_query(&mysql, "SET NAMES 'GB2312'");
char sql[512];
sprintf_s(sql, "DELETE FROM 物料屬性");
mysql_real_query(&mysql, sql, strlen(sql));
// 插入資料(參數化建議用 Prepared Statement,此處示範拼接)
sprintf_s(sql,
"INSERT INTO 物料屬性(物料編號,物料名稱,所屬類別,計量單位,樣品單價,批量單價) "
"VALUES('%s','%s','%s','%s','%s','%s')",
arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]);
mysql_real_query(&mysql, sql, strlen(sql));
mysql_close(&mysql);
mysql_stmt_prepare/bind_param/execute 防 SQL 注入、提升重複執行效能。mysqlpp、soci 等 C++ 封裝庫。utf8mb4,避免亂碼。mysql_errno()/mysql_error() 記錄日誌。掌握此套流程,MFC 老專案也能輕鬆接入 MySQL,享受關係型資料庫的威力。