首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VS2010 MFC 連接 MySQL 完整實戰:從配置環境到登錄模塊代碼

     編輯:程式設計疑難解答

環境準備 (關鍵步驟,漏一步即報錯)

  1. 安裝 MySQL Connector/C 6.1+ (32位):即使 OS 是 64位,VS2010 項目默認 32位,**必須安裝 32位 Connector**。下載 mysql-connector-c-6.1.11-win32.msi。
  2. 配置 VC++ 目錄 (項目屬性 → VC++ Directories):
    • Include Directories 添加:C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include
    • Library Directories 添加:C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\lib
  3. 鏈接器輸入 (Linker → Input → Additional Dependencies) 添加:libmysql.lib
  4. 運行時 DLL:將 libmysql.dll 複製到項目 Debug/Release 目錄,或系統 System32/SysWOW64,否則運行時報「找不到 libmysql.dll」。
  5. 字符集設置:項目屬性 → General → Character Set:**「Use Multi-Byte Character Set」**(MBCS),**不要用 Unicode**,否則字符串傳遞需大量轉換極易出錯。

數據庫配置 (題目場景)

  • IP: 192.168.1.223 (局域網 phpStudy 搭建)
  • 用戶: root / 密碼: note2016
  • 端口: 3306
  • 數據庫: cxdayang
  • 表: user (字段: id, username, password...)

MFC 登錄模塊核心代碼

// LoginDlg.cpp
#include "mysql.h"
#pragma comment(lib, "libmysql.lib")

BOOL CLoginDlg::OnInitDialog() {
    CDialogEx::OnInitDialog();
    // 初始化控件...
    return TRUE;
}

void CLoginDlg::OnBnClickedBtnLogin() {
    CString strUser, strPwd;
    GetDlgItemText(IDC_EDIT_USER, strUser);
    GetDlgItemText(IDC_EDIT_PWD, strPwd);
    
    // 轉換為 MBCS char* (項目為 MBCS 字符集)
    CT2A szUser(strUser);
    CT2A szPwd(strPwd);
    
    MYSQL mysql;
    mysql_init(&mysql);
    
    // 連接數據庫
    if (!mysql_real_connect(&mysql, "192.168.1.223", "root", "note2016", 
                            "cxdayang", 3306, NULL, 0)) {
        AfxMessageBox(_T("數據庫連接失敗: ") + CString(mysql_error(&mysql)));
        mysql_close(&mysql);
        return;
    }
    
    // 設置字符集 (防止中文亂碼)
    mysql_query(&mysql, "SET NAMES gbk"); // 或 utf8, 需與數據庫一致
    
    // 構造參數化查詢 (防 SQL 注入)
    char query[512];
    snprintf(query, sizeof(query), 
             "SELECT id FROM user WHERE username='%s' AND password='%s'", 
             szUser.m_psz, szPwd.m_psz); // 簡化示範,生產必須用 prepared statement
    
    if (mysql_query(&mysql, query)) {
        AfxMessageBox(_T("查詢執行失敗"));
    } else {
        MYSQL_RES* res = mysql_store_result(&mysql);
        if (res && mysql_num_rows(res) > 0) {
            AfxMessageBox(_T("登錄成功!"));
            // 打開主界面...
            EndDialog(IDOK);
        } else {
            AfxMessageBox(_T("用戶名或密碼錯誤"));
        }
        mysql_free_result(res);
    }
    
    mysql_close(&mysql);
}

進階:使用 Prepared Statement (防注入、處理特殊字符)

MYSQL_STMT* stmt = mysql_stmt_init(&mysql);
const char* sql = "SELECT id FROM user WHERE username=? AND password=?";
mysql_stmt_prepare(stmt, sql, strlen(sql));

MYSQL_BIND bind[2];
memset(bind, 0, sizeof(bind));

bind[0].buffer_type = MYSQL_TYPE_STRING;
bind[0].buffer = (void*)szUser.m_psz;
bind[0].buffer_length = strlen(szUser.m_psz);

bind[1].buffer_type = MYSQL_TYPE_STRING;
bind[1].buffer = (void*)szPwd.m_psz;
bind[1].buffer_length = strlen(szPwd.m_psz);

mysql_stmt_bind_param(stmt, bind);
mysql_stmt_execute(stmt);
mysql_stmt_store_result(stmt);

if (mysql_stmt_num_rows(stmt) > 0) { /* 登錄成功 */ }
mysql_stmt_close(stmt);

常見坑與解決

錯誤現象原因解決
Linker Error: unresolved external _mysql_init未鏈接 libmysql.lib鏈接器輸入添加 libmysql.lib,確保庫路徑正確
運行時 "libmysql.dll not found"DLL 不在 PATH/項目目錄複製 libmysql.dll 到 exe 同級目錄
中文亂碼/查詢無結果字符集不匹配連接後執行 SET NAMES gbk/utf8,項目用 MBCS
Access Violation 崩潰指針未檢查/緩衝區溢出檢查 mysql_real_connect 返回值,用 snprintf 防溢出
64位系統連不上用了 64位 Connector 編譯 32位程序**強制使用 32位 Connector C**

總結

VS2010 MFC 連 MySQL 核心在於:**32位 Connector/C + MBCS 字符集 + 正確配置 Include/Lib/Dll 路徑 + 連接後 SET NAMES**。登錄模塊建議使用 **Prepared Statement** 確保安全穩定。新手建議先寫 Console 程序測通數據庫連通性,再遷移到 MFC 界面。

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