首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

使用 OLE DB 開發 Oracle 資料庫應用:ATL 模板與 MFC 類別完整實戰

     編輯:Oracle 資料庫基礎

OLE DB 架構優勢

  • 統一 COM 介面存取**異構資料源** (關聯、多維、文字、郵件等)
  • 不移動資料即可利用底層引擎優勢
  • 健壯錯誤處理、支援非 SQL 指令

兩種開發路徑

  1. ATL OLE DB Consumer Templates:模板化、程式碼少、編譯期類型安全、易結合 MFC
  2. MFC OLE DB 類別:CDataSource/CSession/CCommand/CRowset,更具物件導向特性、動態適應資料庫變化

ATL 開發四步驟

  1. 建立應用程式框架 (MFC AppWizard / ATL COM AppWizard)
  2. 加入 ATL 產生的模板類別 (資料存取器 + 資料列集)
  3. 在應用中使用產生的資料存取物件
  4. 編譯執行

核心模板類別速查

分類類別對應 OLE DB 介面用途
資料源/會話CDataSourceIDBInitialize, IDBCreateSession資料源連接管理
CSessionIOpenRowset, IDBCreateCommand, ITransaction單一會話、建立命令/資料列集、交易控制
CEnumeratorAccessorIParseDisplayName列舉可用 Provider 資訊
存取器CAccessorIAccessor編譯期已知結構,靜態綁定,緩衝區使用者配置
CDynamicAccessorIAccessor + IColumnsInfo運行期動態取得欄資訊自動建立綁定
CManualAccessorIAccessor運行期手動 AddBindEntry 綁定欄位/參數
資料列集CRowsetIRowset, IRowsetChange基本導航 (MoveNext)、讀取 (GetData)、更新 (Insert/Delete/SetData)
CBulkRowsetIRowset + IRowsetFetch單次呼叫取回/操作多列
CArrayRowsetIRowset陣列下標隨機存取
CNoRowset-不傳回資料列集的命令 (DDL、DML)
命令CTableIOpenRowset簡單開啟資料表取得資料列集
CCommandICommand, ICommandText, ICommandPrepare支援 SQL 命令、參數、Prepare/Execute 分離

標準專案包含檔

// stdafx.h
#include 
extern CComModule _Module;
#include 
#include 
#include   // 若使用 Schema Templates

// stdafx.cpp
#include 
CComModule _Module;

資料存取標準流程

  1. 決定存取器類型 (CAccessor/CDynamicAccessor/CManualAccessor) 與資料列集類型
  2. 開啟資料源 → 開啟會話 → 開啟命令/資料表 → 開啟資料列集
  3. 若用 CManualAccessor:GetColumnInfo → AddBindEntry → CreateAccessor → Bind
  4. 迴圈 while (MoveNext() == S_OK) 讀取資料
  5. 關閉資料列集 → 關閉會話 → 關閉資料源

三種存取器讀取資料範例

1. CAccessor (靜態綁定,直接存取成員)

class CMyAccessor : public CAccessor {
public:
  TCHAR szName[40]; long lId;
  BEGIN_ACCESSOR_MAP(CMyAccessor, 2)
    BEGIN_ACCESSOR(0, true)
      COLUMN_ENTRY(1, lId)
      COLUMN_ENTRY(2, szName)
    END_ACCESSOR()
  END_ACCESSOR_MAP()
};

// 使用
CCommand> cmd;
cmd.Open(session, _T("SELECT id, name FROM my_table"));
while (cmd.MoveNext() == S_OK) {
  printf("%ld %s\n", cmd.lId, cmd.szName);
}

2. CDynamicAccessor (動態,GetValue/GetColumn)

CCommand cmd;
cmd.Open(session, _T("SELECT * FROM my_table"));
while (cmd.MoveNext() == S_OK) {
  ULONG cols = cmd.GetColumnCount();
  for (ULONG i = 1; i <= cols; i++) {
    variant_t val = cmd.GetValue(i);
    printf("%s = %s\n", (LPCTSTR)cmd.GetColumnName(i), (LPCTSTR)_bstr_t(val));
  }
}

3. CManualAccessor (手動綁定自訂成員)

struct MYBIND { TCHAR szValue[40]; DBSTATUS dwStatus; };

CCommand cmd;
cmd.Open(session, _T("SELECT name FROM my_table"));
ULONG ulCols; DBCOLUMNINFO* pColInfo; LPOLESTR pStrings;
cmd.GetColumnInfo(&ulCols, &pColInfo, &pStrings);
MYBIND* pBind = new MYBIND[ulCols];
cmd.CreateAccessor(ulCols, pBind, sizeof(MYBIND)*ulCols);
for (ULONG i=0; i

運行期判斷資料型別

僅 CDynamicAccessor/CManualAccessor 支援:GetColumnInfo 取得 DBCOLUMNINFO 中的 wType。

總結

  • ATL 模板適合結構固定、追求編譯期安全、效能敏感的 C++ 專案。
  • MFC OLE DB 類別適合需動態適應結構變化、結合 MFC 文檔/視圖架構的專案。
  • 兩者皆建立在 COM 基礎上,**Provider/Consumer 分離**是核心架構:Consumer 使用 Provider 產生的資料。
  • 現代新專案若非維舊系統,建議考慮 OTL (C++) 或 ADO.NET (.NET) 降低 COM 複雜度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved