首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

VC++ 開發個人事務管理系統實戰:從 ODBC 遷移到 ADO 的完整記錄

     編輯:關於C++

記錄一次 VC++ 6.0 / MFC 專案改造實戰:下載舊專案原始碼、解決 ODBC 連線失敗、修正密碼加密邏輯錯誤、替換 DataGrid 控制項為 ListCtrl、完成個人事務管理介面重設計的全過程。

專案起源與初始狀態

  • 來源:網路開源「人事管理系統」MFC 專案
  • 資料庫:Access MDB (ODBC 連線)
  • 初始錯誤:CDatabase::OpenEx 失敗,ODBC 驅動缺失

關鍵問題與解決方案

1. ODBC 驅動缺失 (32/64 位元陷阱)

現象: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 檔

2. 密碼驗證邏輯錯誤

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" 模式,否則不顯示欄位標頭與列資料。

介面重設計步驟

  1. 修改選單資源:改為「個人事務管理」相關項目 (物品類別、物品清單、記帳...)
  2. 字串表修改:主視窗標題 IDR_MAINFRAME → "個人事務管理資訊系統"
  3. 資料庫調整:JOB 表改為「物品類別表」 (CODE=類別編號, DESCRIPTION=類別名稱)
  4. 新增「物品類別管理」對話框:資源編輯器新增 Dialog + ClassWizard 建立類別
  5. ListCtrl 綁定變數 m_list,OnInitDialog 中填充資料

ODBC 核心程式碼模板


遷移至 ADO 的建議 (後續優化)

  • 引入 #import "msado15.dll" no_namespace rename("EOF", "adoEOF")
  • 使用 _ConnectionPtr, _RecordsetPtr 智慧指標
  • 支援斷線重連、非同步執行、參數化查詢 (防 SQL 注入)
  • DataGrid 可直接繫結 ADO Recordset,免手動填充

心得總結

  1. 32/64 位元 ODBC 分離 是 VC++ 老專案移植 Win10/11 必踩大坑
  2. 加密驗證邏輯 必須搞清「資料庫存什麼」vs「比較什麼」,單元測試加密函數確定性
  3. 控制項選型:ODBC 陣營用 ListCtrl/ListView 手動填充最穩;ADO 陣營才用 DataGrid/ADO Data Control
  4. MFC ClassWizard 雖古老但仍好用:Ctrl+W 快速建立對話框類別、變數綁定、訊息對應
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved