記錄一次 VC++ 6.0 / MFC 專案改造實戰:下載舊專案原始碼、解決 ODBC 連線失敗、修正密碼加密邏輯錯誤、替換 DataGrid 控制項為 ListCtrl、完成個人事務管理介面重設計的全過程。
CDatabase::OpenEx 失敗,ODBC 驅動缺失現象:ODBC 資料來源管理員 (odbcad32.exe) 中無 Microsoft Access Driver (*.mdb)
原因:64 位元 Windows 的 C:\Windows\System32\odbcad32.exe 管理 64 位元驅動;32 位元 VC++ 專案需 32 位元驅動,位於 C:\Windows\SysWOW64\odbcad32.exe
解決:執行 SysWOW64\odbcad32.exe → 系統 DSN → 新增 → 選擇 "Microsoft Access Driver (*.mdb)" → 選擇專案附帶的 .mdb 檔
BOOL CMyDialog::OnInitDialog() {
CDialog::OnInitDialog();
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_list.InsertColumn(0, _T("類別編號"), LVCFMT_LEFT, 180);
m_list.InsertColumn(1, _T("類別名稱"), LVCFMT_LEFT, 180);
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM JOB"));
int row = 0;
CString code, desc;
while (!rs.IsEOF()) {
rs.GetFieldValue(_T("CODE"), code);
rs.GetFieldValue(_T("DESCRIPTION"), desc);
m_list.InsertItem(row, code);
m_list.SetItemText(row, 1, desc);
++row;
rs.MoveNext();
}
rs.Close();
return TRUE;
}
關鍵屬性:ListCtrl 屬性 → Styles → 勾選 "Report" 模式,否則不顯示欄位標頭與列資料。
IDR_MAINFRAME → "個人事務管理資訊系統"m_list,OnInitDialog 中填充資料遷移至 ADO 的建議 (後續優化)
#import "msado15.dll" no_namespace rename("EOF", "adoEOF")_ConnectionPtr, _RecordsetPtr 智慧指標