ADO 三大核心介面
| 介面 | 功能 | 適用場景 |
_ConnectionPtr | 建立資料庫連線、執行無回傳結果 SQL(DDL、Stored Procedure) | 全域連線物件,重複使用 |
_CommandPtr | 執行回傳記錄集的 SQL/預存程序,支援參數綁定 | 單次或少數查詢,可獨立連線字串 |
_RecordsetPtr | 完整記錄集控制:游標類型、鎖定模式、導航、篩選、書籤 | 複雜資料操作、UI 綁定、批次更新 |
基本程式流程
- 初始化 COM Library(
AfxOleInit() 或 CoInitialize())
#import 引入 ADO 型別庫(msado15.dll)
- 建立
_ConnectionPtr,呼叫 Open() 連線
- 透過
_CommandPtr 或 _RecordsetPtr 執行 SQL/取得記錄集
- 處理資料(讀取/新增/修改/刪除)
- 關閉連線、釋放物件、
CoUninitialize()
VC++ 關鍵程式碼片段
1. 初始化 COM 與匯入型別庫
// stdafx.h
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
2. 建立連線
_ConnectionPtr m_pConnection;
HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection));
_bstr_t strConn = "Provider=SQLOLEDB; Server=MyServer; Database=MyDB; uid=sa; pwd=pwd;";
try {
m_pConnection->Open(strConn, "", "", adConnectUnspecified);
} catch (_com_error &e) {
AfxMessageBox(e.Description());
}
3. 開啟記錄集並讀取
_RecordsetPtr pRs;
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open(_variant_t("SELECT * FROM Users"),
_variant_t((IDispatch*)m_pConnection),
adOpenKeyset, adLockOptimistic, adCmdText);
while (pRs->adoEOF == VARIANT_FALSE) {
CString name = (LPCSTR)(_bstr_t)pRs->Fields->GetItem("UserName")->Value;
// 處理資料...
pRs->MoveNext();
}
4. 修改資料
pRs->Fields->GetItem("Address")->Value = _bstr_t("新地址");
pRs->Update();
進階主題(略)
- 參數化 Command、預存程序呼叫
- 游標類型(Static/Keyset/Dynamic/ForwardOnly)與鎖定模式選擇
- 交易控制:
BeginTrans/CommitTrans/RollbackTrans
- 事件通知:
ConnectionEvents、RecordsetEvents
- 資料繫結、篩選、排序、書籤導航
三種開發方式比較
#import 智慧指標:開發效率最高,程式碼最清晰,推薦首選
ColeDispatchDriver 派生類:次之,適合不想用 #import 專案
- 純 COM API:效能最好、體積最小、控制力最強,但開發極繁瑣