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

C++ 連接 MySQL 實戰:官方 C API 開發指南與 VS 平台避坑

     編輯:MySQL 綜合教學

C++ 連接 MySQL 實戰:官方 C API 開發指南與 VS 平台避坑

C/C++ 訪問 MySQL 推薦使用官方 libmysqlclient C API,無需額外 ODBC 驅動,性能最優、依賴最少。本文涵蓋 VS2010/2015 環境配置、核心 API 調用流程、完整代碼示例、64 位編譯陷阱與常用 API 速查表。

一、環境配置

  1. 頭文件目錄:MySQL 安裝目录\include(如 C:\Program Files\MySQL\MySQL Server 5.7\include)
  2. 庫文件:將 libmysql.lib、libmysql.dll 複製至專案目錄
  3. 代碼引用:
    #include "winsock.h"  // Windows Socket 依賴
    #include "mysql.h"
    #pragma comment(lib, "libmysql.lib")

二、核心流程代碼

1. 連接數據庫

MYSQL m_sqlCon;

bool ConnectDB() {
    try {
        mysql_init(&m_sqlCon);
        // host, user, pass, db, port, unix_socket, client_flag
        if (!mysql_real_connect(&m_sqlCon, "localhost", "root", "root", "test", 3306, NULL, 0)) {
            AfxMessageBox(_T("數據庫連接失敗! ") + CString(mysql_error(&m_sqlCon)));
            return false;
        }
        // 設置字符集(防中文亂碼)
        mysql_set_character_set(&m_sqlCon, "utf8mb4");
        return true;
    } catch (...) {
        return false;
    }
}

2. 關閉連接

void CloseDB() {
    mysql_close(&m_sqlCon);
}

3. 執行 DDL/DML(無結果集)

bool ExecuteSQL(const char* sql) {
    if (mysql_real_query(&m_sqlCon, sql, (unsigned long)strlen(sql)) != 0) {
        const char* err = mysql_error(&m_sqlCon);
        // 記錄錯誤
        return false;
    }
    return true;
}

// 創建表示例
ExecuteSQL("CREATE TABLE IF NOT EXISTS DS_Building("
           "ID VARCHAR(10) PRIMARY KEY,"
           "Name VARCHAR(255),"
           "Descs VARCHAR(255)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

4. 查詢處理(有結果集)

bool QueryData(const char* sql) {
    if (mysql_real_query(&m_sqlCon, sql, (unsigned long)strlen(sql)) != 0) return false;
    
    MYSQL_RES* result = mysql_store_result(&m_sqlCon);  // 獲取完整結果集
    if (!result) return false;
    
    int num_fields = mysql_num_fields(result);
    MYSQL_FIELD* fields = mysql_fetch_fields(result);   // 列元數據
    
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(result))) {
        for (int i = 0; i < num_fields; ++i) {
            printf("%s: %s\t", fields[i].name, row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }
    mysql_free_result(result);  // 必須釋放
    return true;
}

三、VS 64 位編譯陷阱(高頻坑)

現象:LNK2019 無法解析的外部符號 _mysql_init@4 等

原因:VS 默認目標平台為 x86 (32位),而安裝的 MySQL 是 64 位,庫文件架構不匹配。

解決:

  1. 專案屬性 → 配置管理器 → 活動解決方案平台 → 新建 → x64
  2. 或下載 32 位 libmysql.lib/dll 替換(不推薦,限制進程內存)

四、常用 C API 速查表

分類API用途
連接管理mysql_init()初始化 MYSQL 結構
mysql_real_connect()建立連接(推薦)
mysql_close()關閉連接
查詢執行mysql_real_query()執行帶長度 SQL(支持二進制)
mysql_query()執行以 \0 結尾 SQL
mysql_store_result()緩存完整結果集到客戶端
結果集處理mysql_fetch_row()逐行獲取
mysql_fetch_field()獲取列元數據
mysql_num_fields/rows()列數/行數
mysql_free_result()釋放結果集內存
事務控制mysql_autocommit()開關自動提交
mysql_commit()提交事務
mysql_rollback()回滾事務
錯誤處理mysql_errno()錯誤碼
mysql_error()錯誤信息
mysql_sqlstate()SQLSTATE 代碼
預處理mysql_stmt_prepare()準備語句
mysql_stmt_execute()執行預處理

五、最佳實踐建議

  • RAII 封裝:用 C++ 類封裝 MYSQL*、MYSQL_RES*,析構函數自動 mysql_close/mysql_free_result,防洩漏。
  • 連接池:高併發場景自行實現或使用 mysqlcppconn (Connector/C++) 內建池。
  • 字符集:連接建立後立即 mysql_set_character_set(&mysql, "utf8mb4")。
  • 預處理:所有業務查詢優先用 mysql_stmt_* 防注入、提升重複執行效率。
  • 錯誤重試:針對 CR_SERVER_GONE_ERROR (2006)、CR_CONNECTION_ERROR (2013) 實施指數退避重連。

六、總結

官方 C API 輕量、高效、無第三方依賴,是 C/C++ 訪問 MySQL 的最佳選擇。關鍵點:x64 平台編譯、RAII 管理資源、utf8mb4 字符集、預處理防注入、錯誤碼驅動重試。掌握核心 10 個 API 即可覆蓋 90% 業務場景。

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