首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MFC 專案對接 MySQL C API 完整實戰:配置、連接、增刪改查

     編輯:MySQL 綜合教學

MFC 專案對接 MySQL C API 完整實戰:配置、連接、增刪改查

Visual Studio MFC 專案若需原生高效操作 MySQL,官方提供的 C API(libmysql.dll)是輕量且穩定的選擇。本文記錄從專案屬性配置、核心 API 封裝到 CRUD 範例的完整落地步驟。

一、專案屬性配置(VS 2017/2019/2022 通用)

  1. 包含目錄:
    專案 → 屬性 → C/C++ → 一般 → 附加包含目錄 → 新增 MySQL 安裝目錄下的 include 資料夾(如 C:\Program Files\MySQL\MySQL Server 5.6\include)。
  2. 庫目錄:
    連結器 → 一般 → 附加庫目錄 → 新增 MySQL lib 資料夾(如 C:\Program Files\MySQL\MySQL Server 5.6\lib)。
  3. 附加相依性:
    連結器 → 輸入 → 附加相依性 → 新增 libmysql.lib。
    或在程式碼頂部加入:#pragma comment(lib, "libmysql.lib")。
  4. 複製 DLL:
    將 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("資料庫連接成功!"));

四、查詢並填充 CListCtrl 範例

// 設定字元集,解決中文亂碼
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,避免亂碼。
  • 錯誤處理:每次 API 呼叫後檢查回傳值,mysql_errno()/mysql_error() 記錄日誌。

掌握此套流程,MFC 老專案也能輕鬆接入 MySQL,享受關係型資料庫的威力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved