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

VC++ 使用 ADO 存取 Access 資料庫完整實戰指南

     編輯:關於C語言

介面導向程式設計的核心在於遵循約定。對於忙碌的開發者,掌握 ADO 在 VC++ 中連接 Access 的標準流程,能快速落地資料庫操作。本文從環境配置、COM 初始化、連線管理到 CRUD 操作,提供完整可執行的程式碼範本。

1. 環境配置:引入 ADO 型別庫

在 StdAfx.h 中加入:

#include <comdef.h> // 需時引入
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")

rename("EOF", "adoEOF") 避免與 C++ 標準庫的 EOF 衝突。

2. COM 環境初始化與核心智慧指標

MFC 專案於 InitInstance() 呼叫 AfxOleInit() 或 CoInitialize(NULL);非 MFC 直接用 CoInitialize(NULL)。程式結束前需呼叫 CoUninitialize()。

三大核心智慧指標:

  • _ConnectionPtr:管理資料庫連線,執行無回傳結果的 SQL。
  • _RecordsetPtr:記錄集物件,提供豐富游標與鎖定控制,適合查詢與資料操作。
  • _CommandPtr:執行預存程序或帶參數 SQL,可復用連線或獨立連線字串。
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;

3. 資料庫連線與關閉

連線範例(含密碼保護的 .mdb)

::CoInitialize(NULL);
CString strConn = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=blogurl.mdb;");
strConn += _T("Jet OLEDB:Database Password=") + DB_PASSWRD_STRING + _T(";Persist Security Info=False;");

HRESULT hr;
try {
    hr = m_pConnection.CreateInstance(__uuidof(ADODB::Connection));
    if (SUCCEEDED(hr)) {
        hr = m_pConnection->Open((_bstr_t)strConn, _T(""), _T(""), adModeUnknown);
        // Access 97 需改用 Provider=Microsoft.Jet.OLEDB.3.51
    }
} catch (_com_error &e) {
    CString msg; msg.Format(_T("連線失敗:%s"), e.ErrorMessage());
    AfxMessageBox(msg); return FALSE;
}

關閉連線

if (m_pConnection->State) m_pConnection->Close();
m_pConnection = NULL;

4. 記錄集操作:查詢、遍歷、欄位讀取

m_pRecordset.CreateInstance(__uuidof(ADODB::Recordset));
try {
    m_pRecordset->Open(_T("SELECT * FROM BlogUrl"),
        m_pConnection.GetInterfacePtr(),
        adOpenDynamic, adLockOptimistic, adCmdText);

    while (!m_pRecordset->adoEOF) {
        _variant_t vID = m_pRecordset->GetCollect(_T("ID")); // 或 GetCollect(_variant_t((long)0))
        // 處理 vID...
        m_pRecordset->MoveNext();
    }
    m_pRecordset->Close();
} catch (_com_error &e) {
    AfxMessageBox((LPTSTR)e.Description());
}

5. 常用 CRUD 語法速查

操作關鍵步驟
新增AddNew() → PutCollect("欄位", 值) → Update()
修改定位記錄 → PutCollect("欄位", 新值) → Update()
刪除定位記錄 → Delete(adAffectCurrent) → Update()

定位方式:Find 條件查詢 或 Move(index) 相對移動。

最佳實踐建議

  • 頻繁存取時,建立全域 _ConnectionPtr 復用連線,減少開關開銷。
  • 統一使用 try-catch(_com_error) 捕獲 ADO 例外,並記錄 ErrorMessage() 或 Description()。
  • 記錄集用完即關閉(Close()),避免游標資源洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved