CDataSource/CSession/CCommand/CRowset,更具物件導向特性、動態適應資料庫變化| 分類 | 類別 | 對應 OLE DB 介面 | 用途 |
|---|---|---|---|
| 資料源/會話 | CDataSource | IDBInitialize, IDBCreateSession | 資料源連接管理 |
CSession | IOpenRowset, IDBCreateCommand, ITransaction | 單一會話、建立命令/資料列集、交易控制 | |
CEnumeratorAccessor | IParseDisplayName | 列舉可用 Provider 資訊 | |
| 存取器 | CAccessor | IAccessor | 編譯期已知結構,靜態綁定,緩衝區使用者配置 |
CDynamicAccessor | IAccessor + IColumnsInfo | 運行期動態取得欄資訊自動建立綁定 | |
CManualAccessor | IAccessor | 運行期手動 AddBindEntry 綁定欄位/參數 | |
| 資料列集 | CRowset | IRowset, IRowsetChange | 基本導航 (MoveNext)、讀取 (GetData)、更新 (Insert/Delete/SetData) |
CBulkRowset | IRowset + IRowsetFetch | 單次呼叫取回/操作多列 | |
CArrayRowset | IRowset | 陣列下標隨機存取 | |
CNoRowset | - | 不傳回資料列集的命令 (DDL、DML) | |
| 命令 | CTable | IOpenRowset | 簡單開啟資料表取得資料列集 |
CCommand | ICommand, ICommandText, ICommandPrepare | 支援 SQL 命令、參數、Prepare/Execute 分離 |
// stdafx.h
#include
extern CComModule _Module;
#include
#include
#include // 若使用 Schema Templates
// stdafx.cpp
#include
CComModule _Module;
CAccessor/CDynamicAccessor/CManualAccessor) 與資料列集類型CManualAccessor:GetColumnInfo → AddBindEntry → CreateAccessor → Bindwhile (MoveNext() == S_OK) 讀取資料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);
}
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));
}
}
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。