ActiveX Data Objects (ADO) 是 OLE DB 之上的高階資料存取介面,提供簡單且強大的資料庫操作模型。在 Visual C++ 6.0 中透過 #import 引入 ADO 型別庫,搭配智慧指標 (_ConnectionPtr、_RecordsetPtr) 即可輕鬆實現資料庫連線、查詢與資料綁定。本文將完整說明從專案設定到核心程式碼的實作細節。
在應用程式類別的 InitInstance 中呼叫 AfxOleInit() 初始化 OLE/COM 環境,因為 ADO 是以 COM 元件實作。
在 stdafx.h 中加入:
#include <comdef.h>
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace \
rename("EOF", "adoEOF")
comdef.h 提供 _variant_t、_bstr_t 等 COM 輔助類別no_namespace 避免命名空間衝突rename("EOF", "adoEOF") 解決與其他庫的 EOF 衝突在對話框或視圖類別標頭檔中宣告:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
CListCtrl m_List; // 用於顯示查詢結果
在 OnInitDialog 中實作:
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
_variant_t TheValue;
m_List.ResetContent();
try
{
// 建立連線與記錄集實例
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 開啟 ODBC 資料來源
m_pConnection->Open(_T("DSN=ADOTest"), _T(""), _T(""), 0);
// 執行 SQL 查詢
m_pRecordset->Open(_T("SELECT * FROM BlockDefine"),
_variant_t((IDispatch*)m_pConnection),
adOpenDynamic, adLockOptimistic, adCmdText);
// 遍歷記錄集
while (!m_pRecordset->adoEOF)
{
TheValue = m_pRecordset->GetCollect(_T("BlockIndex"));
if (TheValue.vt != VT_NULL)
m_List.AddString((char*)_bstr_t(TheValue));
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_pConnection->Close();
}
catch (_com_error &e)
{
AfxMessageBox(e.ErrorMessage());
}
m_pRecordset = NULL;
m_pConnection = NULL;
return TRUE;
}
_ConnectionPtr、_RecordsetPtr 在離開作用域時自動釋放,減少記憶體洩漏風險。_variant_t 封裝 VARIANT,_bstr_t 處理 BSTR 字串,簡化 COM 與 C++ 型別互轉。_com_error 可取得詳細的 HRESULT 錯誤描述。須在控制台「ODBC 資料來源管理員」中建立名為 ADOTest 的系統 DSN,指向目標 Access 資料庫 (如 data.mdb),並確認資料表 BlockDefine 含有 BlockIndex 欄位。