OLE DB透過COM介面提供統一存取介面,支援關聯式與非關聯式資料源(檔案系統、郵件系統、目錄服務等)。核心優勢:
| 類別 | 用途 | 關鍵類別 |
|---|---|---|
| 工作階段類別 | 管理資料源連接與工作階段 | CDataSource、CSession、CEnumeratorAccessor |
| 存取器類別 | 定義資料繫結方式 | CAccessor (靜態)、CDynamicAccessor (動態)、CManualAccessor (手動) |
| 資料列集類別 | 封裝資料列集操作 | CRowSet、CBulkRowset (批量)、CArrayRowset (陣列索引) |
| 命令類別 | 執行SQL命令 | CTable (簡單存取)、CCommand (完整SQL支援) |
#include
extern CComModule _Module;
#include
#include
#include // 結構描述模板
#include
CComModule _Module;
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"));
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()
};
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);
}
}
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中的wTypeOLE DB配合ATL消費者模板,提供強大且彈性的資料存取框架。掌握三類核心模板(工作階段、存取器、資料列集)與三種存取器策略(靜態/動態/手動),即可應對從簡單查詢到複雜動態綁定的各種需求。提供者模板進一步開啟自訂資料源開發大門。