實現基於對話框的 MFC 應用,包含數據列表顯示、添加、修改、刪除四大核心數據庫操作功能。

mysql-connector-odbc-3.51 Windows 版(ZIP 或 Setup.exe)。setup.exe,按提示完成傻瓜式安裝。兩種方式:手工配置(安全、永久)與代碼動態創建(部署便捷)。


odbctest(建議純英文)localhost 或遠程 IProotodbc)使用 SQLConfigDataSource API,程序運行時自動註冊:
SQLConfigDataSource(
NULL,
ODBC_ADD_DSN,
"MySQL ODBC 3.51 Driver",
"DSN=odbctest;UID=root;PWD=;SERVER=localhost;DATABASE=odbc;"
);
參數說明:ODBC_ADD_DSN 表示新增;驅動名稱需與驅動管理器中顯示的一致;連接字符串用分號分隔。
ODBCTest,選擇「基於對話框」,Finish。編輯 stdafx.h:
#include <odbcinst.h>
#include <afxdb.h> // MFC 數據庫類
IDD_ODBCTEST_DIALOG

在 MySQL 中創建庫 odbc、表 list:
CREATE TABLE list (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(40) NOT NULL,
age TINYINT NOT NULL
);
插入幾條測試數據。

GetRecord()在 CODBCTestDlg 類中添加成員函數:
void CODBCTestDlg::GetRecord() {
m_list.DeleteAllItems(); // 清空列表
CDatabase db;
// 連接字符串格式:ODBC;DSN=xxx;UID=xxx;PWD=xxx
if (!db.OpenEx(_T("ODBC;DSN=odbctest;UID=root;PWD="), CDatabase::noOdbcDialog)) {
AfxMessageBox(_T("數據庫連接失敗"));
return;
}
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM list ORDER BY id ASC"));
int nRow = 0;
while (!rs.IsEOF()) {
CString varID, varName, varAge;
rs.GetFieldValue(_T("id"), varID);
rs.GetFieldValue(_T("name"), varName);
rs.GetFieldValue(_T("age"), varAge);
m_list.InsertItem(nRow, varID);
m_list.SetItemText(nRow, 1, varName);
m_list.SetItemText(nRow, 2, varAge);
rs.MoveNext();
nRow++;
}
rs.Close();
db.Close();
// 自適應列寬(需自行實現或使用現成類)
// m_list.AdjustColumnWidth();
}
在 OnInitDialog 中調用 GetRecord() 初始化顯示;添加/修改/刪除操作後同樣調用刷新。
// 修改記錄示例
CString sql;
sql.Format(_T("UPDATE list SET name='%s', age=%d WHERE id=%d"), strName, nAge, nID);
db.ExecuteSQL(sql); // 需先 db.OpenEx
GetRecord(); // 刷新列表
同理實現插入(INSERT INTO)與刪除(DELETE FROM)。
CDatabase:管理數據庫連接,OpenEx 建立連接,ExecuteSQL 執行非查詢 SQL。CRecordset:封裝結果集,Open 執行查詢,GetFieldValue 取字段值,MoveNext 移動游標。odbc32.lib(VC6 默認已含)。