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

VC 下 ADO 編程入門 (1):對話框應用連接 Access 資料庫顯示資料至列表框

     編輯:VC 教學

專案目標

建立 MFC 對話框應用 `zjy`,點擊按鈕讀取本地 Access 資料庫 (`MyDb1.mdb`) 中 `MyTable1` 表的 `n1` 欄位,顯示於列表框 (`CListBox`),並彈窗顯示記錄總數。

環境與資源

  • VC6 + Access 2000 (Jet 4.0 OLE DB Provider)
  • 對話框資源:List Box (IDC_LIST_DATA) + Button (IDC_BTN_QUERY)
  • ClassWizard:List Box 關聯變數 `m_list` (CListBox)

完整實現步驟

1. StdAfx.h 引入 ADO

#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
    no_namespace rename("EOF", "adoEOF")

2. zjyDlg.h 宣告智能指標成員

class CZjyDlg : public CDialog {
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;
    // ...
};

3. zjyDlg.cpp OnInitDialog 初始化 OLE

BOOL CZjyDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    if (!AfxOleInit()) {
        AfxMessageBox(_T("COM 初始化失敗!"));
        return FALSE;
    }
    return TRUE;
}

4. 按鈕點擊處理:連接、查詢、填充、清理

void CZjyDlg::OnButton1() {
    m_list.ResetContent();
    int nCount = 0;

    try {
        // 創建連接與記錄集物件
        m_pConnection.CreateInstance(__uuidof(Connection));
        m_pRecordset.CreateInstance(__uuidof(Recordset));

        // 開啟 Access 資料庫 (Jet OLEDB 4.0)
        m_pConnection->Open(
            _bstr_t(L"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\\ActiveX 數據對象\\VC_Access\\zjy\\MyDb1.mdb;"),
            _bstr_t(L""), _bstr_t(L""), 0);

        // 開啟記錄集 (動態游標、樂觀鎖定、SQL 命令)
        m_pRecordset->Open(
            _bstr_t(L"SELECT * FROM MyTable1"),
            _variant_t((IDispatch*)m_pConnection, true),
            adOpenDynamic, adLockOptimistic, adCmdText);

        // 遍歷記錄
        m_pRecordset->MoveFirst();
        while (!m_pRecordset->adoEOF) {
            _variant_t val = m_pRecordset->GetCollect(_bstr_t(L"n1"));
            if (val.vt != VT_NULL) {
                m_list.AddString((char*)_bstr_t(val));  // _bstr_t 自動轉 ANSI
                nCount++;
            }
            m_pRecordset->MoveNext();
        }
    }
    catch (_com_error& e) {
        AfxMessageBox(e.ErrorMessage());
    }

    // 清理
    if (m_pRecordset) { m_pRecordset->Close(); m_pRecordset = NULL; }
    if (m_pConnection) { m_pConnection->Close(); m_pConnection = NULL; }

    CString str; str.Format(_T("資料表共有 %d 筆記錄"), nCount);
    AfxMessageBox(str);
}

關鍵技術點解析

環節代碼/說明
ADO 導入`#import msado15.dll rename("EOF","adoEOF")` 避免與 MFC `CRecordset::EOF` 衝突
OLE 初始化`AfxOleInit()` 在對話框初始化時呼叫一次
連接字串Jet 4.0: `Provider=Microsoft.Jet.OLEDB.4.0; Data Source=path.mdb`
Recordset.Open 參數Source, ActiveConnection, CursorType, LockType, Options
游標類型`adOpenDynamic` 雙向滾動、可見他人變更;`adOpenStatic` 快照
鎖定類型`adLockOptimistic` 更新時鎖;`adLockPessimistic` 編輯即鎖
欄位取值`GetCollect("ColumnName")` 返回 `_variant_t`,轉 `_bstr_t` 再轉 `CString`
EOF 判斷用重命名後的 `adoEOF`
資源釋放Close → 智能指標賦 NULL (觸發 Release)

常見問題與解決

  • 找不到資料庫檔案:路徑需雙反斜線 `\\` 或正斜線 `/`,確認檔案存在
  • 編譯錯誤 `EOF` 未宣告:檢查 `rename("EOF","adoEOF")` 是否生效,代碼中用 `adoEOF`
  • 中文亂碼:Access 資料庫排序規則、專案設 Unicode、`_bstr_t` 自動處理轉換
  • 記憶體洩漏:所有路徑 (正常/例外) 都要 `Close()` 並賦 `NULL`

結語

本例以最小代碼展示 VC+ADO 讀取 Access 的完整流程:`#import` → `CreateInstance` → `Open` → `MoveFirst/Next` 遍歷 → `GetCollect` 取值 → `Close`。下一篇將進階至 SQL Server 連接、ListCtrl 報表模式顯示、參數化查詢等實戰技巧。

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