曾在 NIIT Bangalore 開發線上銀行專案,主要用 VB,僅小部分用 ATL 組件。此處展示一個用 ATL+ADO 查詢 SQL Server 後端的中間層組件代碼片段。假設讀者懂 ATL COM 程式設計與 VB ADO 程式設計。
ADO (ActiveX Data Objects):基於 COM 介面的 OLE DB 高階介面,提供面向物件的資料源存取。集 DAO 與 RDO 之大成,支援:所有資料類型、自由執行緒、非同步查詢、客戶/伺服端游標、離線記錄集。
FindCust,伺服器類型 Dynamic Link Library,勾選 Support MFC。Search,確定。SearchCust,參數:[in] BSTR bstrcustid, [out,retval] _Recordset **ptrRecordset 參考,需匯入 ADO 庫。編輯 StdAfx.h 加入:#import "C:\Program Files\Common Files\System\ADO\MSADO15.DLL" \
rename_namespace("ADOCust") rename("EOF", "EndOfFile")
using namespace ADOCust;
rename_namespace 變更命名空間名稱,rename 將 EOF 改為 EndOfFile (避免與標準頭文件衝突)。
.idl 亦含 SearchCust 方法,為讓 MIDL 編譯器識別 ADO 物件,在 library 區段 importlib "stdole2.tlb" 後加入:importlib("C:\Program Files\Common Files\System\ADO\MSADO15.DLL");
將介面定義移至新 importlib 之後,最終介面定義如下:
[
object, uuid(EB78D558-E071-4D25-80DD-41FD3519934E),
dual, helpstring("ISearch Interface"), pointer_default(unique)
]
interface ISearch : IDispatch {
[id(1), helpstring("method SearchCust")]
HRESULT SearchCust([in] BSTR rcustid, [out,retval] _Recordset **ptr);
};
核心流程:初始化 COM → 連接資料源 → 執行 SQL → 回傳 Recordset → 反初始化 COM。
// 1. 初始化 COM
CoInitialize(NULL);
// 2. 連接資料源
_ConnectionPtr conptr(__uuidof(Connection));
conptr->Open(_T("Provider=SQLOLEDB.1;Data Source=SQLServer;Initial Catalog=Customer"),
_T("user1"), _T(""), adOpenUnspecified);
// 參數:連接字串、用戶名、密碼、游標類型
// 3. 執行 SQL 命令
_CommandPtr cmd(__uuidof(Command));
cmd->ActiveConnection = conptr;
cmd->CommandText = "<Your SQL statement goes here>";
// 4. 建立 Recordset 並指定命令為來源
_RecordsetPtr rst(__uuidof(Recordset));
rst->PutRefSource(cmd);
// 5. 開啟 Recordset
_variant_t vNull;
rst->Open(vNull, vNull, adOpenDynamic, adLockOptimistic, adCmdText);
// 參數:來源、連接、游標類型、鎖定類型、命令評估方式
// 6. 回傳 Recordset 給客戶端
rst->QueryInterface(__uuidof(_Recordset), (void**)ptr);
// 7. 反初始化 COM
::CoUninitialize();
開啟 VB 建立 標準 EXE 專案,簡單不再贅述。編譯組件後即可在 VB 中引用 FindCust 型別庫呼叫 SearchCust 取得記錄集顯示。