首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

ATL COM 結合 ADO 實現資料庫中間層組件開發

     編輯:關於VC++

專案背景

曾在 NIIT Bangalore 開發線上銀行專案,主要用 VB,僅小部分用 ATL 組件。此處展示一個用 ATL+ADO 查詢 SQL Server 後端的中間層組件代碼片段。假設讀者懂 ATL COM 程式設計與 VB ADO 程式設計。

什麼是 ADO?

ADO (ActiveX Data Objects):基於 COM 介面的 OLE DB 高階介面,提供面向物件的資料源存取。集 DAO 與 RDO 之大成,支援:所有資料類型、自由執行緒、非同步查詢、客戶/伺服端游標、離線記錄集。

ADO 物件模型三大核心

  • Connection:建立資料源連接,連接字串含 DSN、位置、使用者、密碼等。
  • Command:執行 SQL 命令、查詢、預存程序。
  • Recordset:儲存查詢結果集,資料可修改並更新回資料庫。

建立 ATL DLL 組件步驟

  1. 用 ATL COM AppWizard 產生框架,專案名 FindCust,伺服器類型 Dynamic Link Library,勾選 Support MFC。
  2. 插入 New ATL Object,選 Simple Object,Short Name 輸入 Search,確定。
  3. 在 ClassView 右鍵介面名稱 Add Method,方法名 SearchCust,參數:
    [in] BSTR bstrcustid, [out,retval] _Recordset **ptr
  4. 因回傳 Recordset 參考,需匯入 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 (避免與標準頭文件衝突)。

  1. .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);
};

實作 SearchCust 方法

核心流程:初始化 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)

開啟 VB 建立 標準 EXE 專案,簡單不再贅述。編譯組件後即可在 VB 中引用 FindCust 型別庫呼叫 SearchCust 取得記錄集顯示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved