建立 MFC 對話框應用 `zjy`,點擊按鈕讀取本地 Access 資料庫 (`MyDb1.mdb`) 中 `MyTable1` 表的 `n1` 欄位,顯示於列表框 (`CListBox`),並彈窗顯示記錄總數。
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace rename("EOF", "adoEOF")
class CZjyDlg : public CDialog {
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
// ...
};
BOOL CZjyDlg::OnInitDialog() {
CDialog::OnInitDialog();
if (!AfxOleInit()) {
AfxMessageBox(_T("COM 初始化失敗!"));
return FALSE;
}
return TRUE;
}
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) |
本例以最小代碼展示 VC+ADO 讀取 Access 的完整流程:`#import` → `CreateInstance` → `Open` → `MoveFirst/Next` 遍歷 → `GetCollect` 取值 → `Close`。下一篇將進階至 SQL Server 連接、ListCtrl 報表模式顯示、參數化查詢等實戰技巧。