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

OLE DB資料庫程式設計:ATL模板與MFC整合實戰

     編輯:關於C語言

一、OLE DB核心優勢與架構

OLE DB透過COM介面提供統一存取介面,支援關聯式與非關聯式資料源(檔案系統、郵件系統、目錄服務等)。核心優勢:

  • 統一資料存取模型,屏蔽底層協定差異
  • 保留原生資料庫技術優勢,無需資料遷移
  • 基於COM,元件化、可擴展、支援分散式架構

二、ATL OLE DB消費者模板開發流程

三大步驟

  1. 建立應用程式框架
  2. 加入ATL產生的模板類別
  3. 在應用中使用產生的資料存取物件

核心模板類別分類

類別用途關鍵類別
工作階段類別管理資料源連接與工作階段CDataSource、CSession、CEnumeratorAccessor
存取器類別定義資料繫結方式CAccessor (靜態)、CDynamicAccessor (動態)、CManualAccessor (手動)
資料列集類別封裝資料列集操作CRowSet、CBulkRowset (批量)、CArrayRowset (陣列索引)
命令類別執行SQL命令CTable (簡單存取)、CCommand (完整SQL支援)

三、專案設定與基本程式碼架構

stdafx.h 必要包含


#include 
extern CComModule _Module;
#include 
#include 
#include   // 結構描述模板

stdafx.cpp 初始化


#include 
CComModule _Module;

四、資料存取完整流程範例

1. 開啟資料源、工作階段、資料列集


CDataSource ds;
CSession session;
CCommand> cmd;  // 使用靜態存取器

// 開啟資料源
ds.Open(_T("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=MyDB;User ID=sa;Password=;"));

// 開啟工作階段
session.Open(ds);

// 開啟命令/資料列集
cmd.Open(session, _T("SELECT * FROM Products"));

2. 靜態存取器 (CAccessor) - 編譯期綁定


class CMyAccessor {
public:
    long m_ProductID;
    TCHAR m_Name[50];
    double m_Price;

    BEGIN_ACCESSOR_MAP(CMyAccessor, 1)
        BEGIN_ACCESSOR(0, TRUE)  // 自動存取器
            COLUMN_ENTRY(1, m_ProductID)
            COLUMN_ENTRY(2, m_Name)
            COLUMN_ENTRY(3, m_Price)
        END_ACCESSOR()
    END_ACCESSOR_MAP()
};

3. 動態存取器 (CDynamicAccessor) - 執行期探索


CDynamicAccessor dynAcc;
CCommand dynCmd;
dynCmd.Open(session, _T("SELECT * FROM Products"));

while (dynCmd.MoveNext() == S_OK) {
    ULONG cols = dynCmd.GetColumnCount();
    for (ULONG i = 0; i < cols; i++) {
        CComVariant var = dynCmd.GetValue(i);
        // 依型別處理...
        CString str = dynCmd.GetColumnName(i);
    }
}

4. 手動存取器 (CManualAccessor) - 完全控制


CManualAccessor manAcc;
CCommand manCmd;
manCmd.Open(session, _T("SELECT * FROM Products"));

// 執行期綁定
ULONG ulCols = 0;
DBCOLUMNINFO* pColInfo = NULL;
LPOLESTR pStrings = NULL;
manCmd.GetColumnInfo(&ulCols, &pColInfo, &pStrings);

struct MYBIND { TCHAR szValue[40]; ULONG dwStatus; };
MYBIND* pBind = new MYBIND[ulCols];
manCmd.CreateAccessor(ulCols, &pBind[0], sizeof(MYBIND)*ulCols);

for (ULONG i = 0; i < ulCols; i++) {
    manCmd.AddBindEntry(i+1, DBTYPE_STR, sizeof(TCHAR)*40, 
                        &pBind[i].szValue, NULL, &pBind[i].dwStatus);
}
manCmd.Bind();

// 存取資料
while (manCmd.MoveNext() == S_OK) {
    _tprintf(_T("%s\n"), pBind[1].szValue);  // 直接使用綁定緩衝區
}

五、資料型別判斷與進階主題

  • 執行期判斷型別:使用動態/手動存取器,呼叫GetColumnInfo取得DBCOLUMNINFO中的wType
  • 提供者開發:ATL提供者模板支援建立自訂OLE DB提供者,實現資料列定位、讀寫、書籤等完整功能
  • 與MFC整合:ATL模板可與MFC資料庫類別搭配,簡化參數化查詢等複雜操作

總結

OLE DB配合ATL消費者模板,提供強大且彈性的資料存取框架。掌握三類核心模板(工作階段、存取器、資料列集)與三種存取器策略(靜態/動態/手動),即可應對從簡單查詢到複雜動態綁定的各種需求。提供者模板進一步開啟自訂資料源開發大門。

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