介面導向程式設計的核心在於遵循約定。對於忙碌的開發者,掌握 ADO 在 VC++ 中連接 Access 的標準流程,能快速落地資料庫操作。本文從環境配置、COM 初始化、連線管理到 CRUD 操作,提供完整可執行的程式碼範本。
在 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 衝突。
MFC 專案於 InitInstance() 呼叫 AfxOleInit() 或 CoInitialize(NULL);非 MFC 直接用 CoInitialize(NULL)。程式結束前需呼叫 CoUninitialize()。
三大核心智慧指標:
_ConnectionPtr:管理資料庫連線,執行無回傳結果的 SQL。_RecordsetPtr:記錄集物件,提供豐富游標與鎖定控制,適合查詢與資料操作。_CommandPtr:執行預存程序或帶參數 SQL,可復用連線或獨立連線字串。_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
::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;
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());
}
| 操作 | 關鍵步驟 |
|---|---|
| 新增 | AddNew() → PutCollect("欄位", 值) → Update() |
| 修改 | 定位記錄 → PutCollect("欄位", 新值) → Update() |
| 刪除 | 定位記錄 → Delete(adAffectCurrent) → Update() |
定位方式:Find 條件查詢 或 Move(index) 相對移動。
_ConnectionPtr 復用連線,減少開關開銷。try-catch(_com_error) 捕獲 ADO 例外,並記錄 ErrorMessage() 或 Description()。Close()),避免游標資源洩漏。