mysql-connector-c-6.1.11-win32.msi。C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\includeC:\Program Files (x86)\MySQL\MySQL Connector C 6.1\liblibmysql.liblibmysql.dll 複製到項目 Debug/Release 目錄,或系統 System32/SysWOW64,否則運行時報「找不到 libmysql.dll」。192.168.1.223 (局域網 phpStudy 搭建)root / 密碼: note20163306cxdayanguser (字段: id, username, password...)// 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);
}
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 界面。