CDynamicAccessor 類別
讓您能在不知道資料庫結構描述 (資料庫的基礎結構) 的情況下,存取資料來源。
語法
class CDynamicAccessor : public CAccessorBase
需求
標頭檔:atldbcli.h
成員
方法
名稱 | 描述 |
---|---|
AddBindEntry | 在覆寫預設存取子時,將系結專案加入至輸出數據行。 |
CDynamicAccessor | 具現化並初始化 CDynamicAccessor 物件。 |
關閉 | 解除系結所有數據行、釋放配置的記憶體,並在類別中釋放 IAccessor 介面指標。 |
GetBlobHandling | 擷取目前數據列的 BLOB 處理值。 |
GetBlobSizeLimit | 擷取以位元組為單位的 BLOB 大小上限。 |
GetBookmark | 擷取目前數據列的書籤。 |
GetColumnCount | 擷取數據列集中的數據行數目。 |
GetColumnFlags | 擷取數據行特性。 |
GetColumnInfo | 擷取數據行元數據。 |
GetColumnName | 擷取指定數據行的名稱。 |
GetColumnType | 擷取指定數據行的數據類型。 |
GetLength | 擷取數據行的最大可能長度,以位元組為單位。 |
GetOrdinal | 擷取指定數據行名稱的數據行索引。 |
GetStatus | 擷取指定數據行的狀態。 |
GetValue | 從緩衝區擷取數據。 |
SetBlobHandling | 設定目前數據列的 BLOB 處理值。 |
SetBlobSizeLimit | 以位元組為單位設定 BLOB 大小上限。 |
SetLength | 以位元組為單位設定數據行的長度。 |
SetStatus | 設定指定數據行的狀態。 |
SetValue | 將數據儲存至緩衝區。 |
備註
使用 CDynamicAccessor
方法來取得數據行資訊,例如數據行名稱、數據行計數、數據類型等等。 然後,您可以使用這個數據行資訊,在運行時間動態建立存取子。
數據行資訊會儲存在由這個類別建立和管理的緩衝區中。 使用 GetValue 從緩衝區取得數據。
如需使用動態存取子類別的討論和範例,請參閱 使用動態存取子。
CDynamicAccessor::AddBindEntry
將系結專案加入至輸出數據行。
語法
HRESULT AddBindEntry(const DBCOLUMNINFO& info) throw();
參數
資訊
[in] DBCOLUMNINFO
結構,包含數據行資訊。 請參閱 OLE DB 程式設計人員參考中的 IColumnsInfo::GetColumnInfo 中的“DBCOLUMNINFO 結構”。
傳回值
其中一個標準 HRESULT 值。
備註
覆寫使用 CDynamicAccessor
建立的預設存取子時,請使用此方法(請參閱 如何擷取數據?)。
CDynamicAccessor::CDynamicAccessor
具現化並初始化 CDynamicAccessor
物件。
語法
CDynamicAccessor(DBBLOBHANDLINGENUM eBlobHandling = DBBLOBHANDLING_DEFAULT,
DBLENGTH nBlobSize = 8000);
參數
eBlobHandling
指定如何處理二進位大型物件 (BLOB) 數據。 預設值為 DBBLOBHANDLING_DEFAULT。 如需 DBBLOBHANDLINGENUM 值的描述,請參閱 SetBlobHandling 。
nBlobSize
最大 BLOB 的大小 (以位元組為單位);此值的資料行資料被視為 BLOB。 默認值為 8,000。 如需詳細資訊,請參閱 SetBlobSizeLimit 。
備註
如果您使用 建構函式來初始化 CDynamicAccessor
物件,您可以指定其系結 BLOB 的方式。 BLOB 可以包含二進位數據,例如圖形、音效或已編譯的程序代碼。 默認行為是將超過8,000個字節的數據行視為BLOB,並嘗試將它們系結至 ISequentialStream
物件。 不過,您可以將不同的值指定為 BLOB 大小。
您也可以指定如何處理 CDynamicAccessor
限定為 BLOB 數據的數據行數據:它可以以預設方式處理 BLOB 數據;它可以略過(不系結)BLOB 數據;也可以系結提供者配置的記憶體中的 BLOB 數據。
CDynamicAccessor::Close
解除系結所有數據行、釋放配置的記憶體,並在類別中釋放 IAccessor 介面指標。
語法
void Close() throw();
CDynamicAccessor::GetBlobHandling
擷取目前數據列的 BLOB 處理值。
語法
const DBBLOBHANDLINGENUM GetBlobHandling() const;
備註
傳回 SetBlobHandling 所設定的 BLOB 處理值 eBlobHandling。
CDynamicAccessor::GetBlobSizeLimit
擷取以位元組為單位的 BLOB 大小上限。
語法
const DBLENGTH GetBlobSizeLimit() const;
備註
傳回由 SetBlobSizeLimit 所設定的 BLOB 處理值 nBlobSize。
CDynamicAccessor::GetBookmark
擷取目前數據列的書籤。
語法
HRESULT GetBookmark(CBookmark< >* pBookmark) const throw();
參數
pBookmark
[out]CBookmark 物件的指標。
傳回值
其中一個標準 HRESULT 值。
備註
您必須將 設定 DBPROP_IRowsetLocate
為 VARIANT_TRUE 以擷取書籤。
CDynamicAccessor::GetColumnCount
擷取數據行數目。
語法
DBORDINAL GetColumnCount() const throw();
傳回值
擷取的數據行數目。
CDynamicAccessor::GetColumnFlags
擷取數據行特性。
語法
bool GetColumnFlags(DBORDINAL nColumn,
DBCOLUMNFLAGS* pFlags) const throw();
參數
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
pFlags
[out]描述數據行特性之位掩碼的指標。 請參閱 OLE DB 程式設計人員參考中的 IColumnsInfo::GetColumnInfo 中的「DBCOLUMNFLAGS 列舉類型」。
傳回值
如果成功擷取資料行特性,則傳 true
回 。 否則會傳回 false
。
備註
數據行編號是從一個位移。 數據行零是特殊案例;如果可用,則為書籤。
CDynamicAccessor::GetColumnInfo
傳回大部分取用者所需的數據行元數據。
語法
HRESULT GetColumnInfo(IRowset* pRowset,
DBORDINAL* pColumns,
DBCOLUMNINFO** ppColumnInfo,
OLECHAR** ppStringsBuffer) throw();
參數
pRowset
[in]IRowset 介面的指標。
pColumns
[out]要在其中傳回數據列集中數據行數目的記憶體指標;這個數位包含書籤數據行,如果有的話。
ppColumnInfo
[out]要在其中傳回結構陣列的 DBCOLUMNINFO
記憶體指標。 請參閱 OLE DB 程式設計人員參考中的 IColumnsInfo::GetColumnInfo 中的“DBCOLUMNINFO 結構”。
ppStringsBuffer
[out]記憶體指標,用來傳回單一配置區塊內所有字串值之記憶體指標(在 columnid 內或 pwszName 中使用的名稱)。
傳回值
其中一個標準 HRESULT 值。
備註
如需數據類型 、 和 的詳細資訊,請參閱 OLE DB 程式設計人員參考中的 IColumnsInfo::GetColumnInfo。OLECHAR
DBCOLUMNINFO
DBORDINAL
CDynamicAccessor::GetColumnName
擷取指定數據行的名稱。
語法
LPOLESTR GetColumnName(DBORDINAL nColumn) const throw();
參數
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
傳回值
指定資料行的名稱。
CDynamicAccessor::GetColumnType
擷取指定數據行的數據類型。
語法
bool GetColumnType(DBORDINAL nColumn,
DBTYPE* pType) const throw();
參數
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
pType
[out]指定之數據行之數據類型的指標。
傳回值
true
在成功或false
失敗時傳回 。
CDynamicAccessor::GetLength
擷取指定數據行的長度。
語法
bool GetLength(DBORDINAL nColumn,
DBLENGTH* pLength) const throw();
bool GetLength(const CHAR* pColumnName,
DBLENGTH* pLength) const throw();
bool GetLength(const WCHAR* pColumnName,
DBLENGTH* pLength) const throw();
參數
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
pColumnName
[in] 指向包含資料行名稱之字元字串的指標。
pLength
[out]整數的指標,包含以位元組為單位的數據行長度。
傳回值
如果找到指定的資料列, 則傳 true
回 。 否則,此函式會傳 false
回 。
備註
第一個覆寫會採用數據行編號,而第二個和第三個覆寫則分別採用 ANSI 或 Unicode 格式的數據行名稱。
CDynamicAccessor::GetOrdinal
擷取指定資料行名稱的資料行數目。
語法
bool GetOrdinal(const CHAR* pColumnName,
DBORDINAL* pOrdinal) const throw();
bool GetOrdinal(const WCHAR* pColumnName,
DBORDINAL* pOrdinal) const throw();
參數
pColumnName
[in] 指向包含資料行名稱之字元字串的指標。
pOrdinal
[out] 指向資料行數目的指標。
傳回值
如果找到具有指定名稱的資料列, 則傳 true
回 。 否則,此函式會傳 false
回 。
CDynamicAccessor::GetStatus
擷取指定數據行的狀態。
語法
bool GetStatus(DBORDINAL nColumn,
DBSTATUS* pStatus) const throw();
bool GetStatus(const CHAR* pColumnName,
DBSTATUS* pStatus) const throw();
bool GetStatus(const WCHAR* pColumnName,
DBSTATUS* pStatus) const throw();
參數
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
pColumnName
[in] 指向包含資料行名稱之字元字串的指標。
pStatus
[out]包含數據行狀態之變數的指標。 如需詳細資訊,請參閱 OLE DB 程式設計人員參考中的 DBSTATUS。
傳回值
如果找到指定的資料列, 則傳 true
回 。 否則,此函式會傳 false
回 。
CDynamicAccessor::GetValue
擷取指定數據行的數據。
語法
void* GetValue(DBORDINAL nColumn) const throw();
void* GetValue(const CHAR* pColumnName) const throw();
void* GetValue(const WCHAR* pColumnName) const throw();
template < class ctype >
bool GetValue(DBORDINAL nColumn, ctype* pData) const throw();
template < class ctype >
bool GetValue(const CHAR* pColumnName, ctype* pData) const throw();
template < class ctype >
bool GetValue(const WCHAR* pColumnName, ctype* pData) const throw();
參數
ctype
[in]樣板化參數,可處理字串類型 (CHAR*
, ) 以外的任何數據類型, WCHAR*
這需要特殊處理。 GetValue
會根據您在這裡指定的專案,使用適當的數據類型。
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
pColumnName
[in]數據行名稱。
pData
[out]指定之數據行內容的指標。
傳回值
如果您想要傳遞字串數據,請使用 的非範本版本 GetValue
。 這個方法的非範本版本會傳回 void*
,指向包含指定之數據行數據的緩衝區部分。 如果找不到數據行,則傳回NULL。
對於所有其他數據類型,使用 樣板化版本的 GetValue
比較簡單。 範本化版本會在成功或false
失敗時傳回true
。
備註
使用非範本版本可傳回包含字串的數據行,以及包含其他數據類型之數據行的樣板化版本。
在偵錯模式中,如果 pData 的大小與它指向的數據行大小不相等,您將會收到判斷提示。
CDynamicAccessor::SetBlobHandling
設定目前數據列的 BLOB 處理值。
語法
bool SetBlobHandling(DBBLOBHANDLINGENUM eBlobHandling);
參數
eBlobHandling
指定 BLOB 資料的處理方式。 它可能需要下列值:
DBBLOBHANDLING_DEFAULT:將大於 nBlobSize 的數據行數據處理為
SetBlobSizeLimit
BLOB 數據,並透過ISequentialStream
或IStream
物件擷取數據。 此選項會嘗試系結包含大於 nBlobSize 或列為 blob 數據DBTYPE_IUNKNOWN的數據行。DBBLOBHANDLING_NOSTREAMS:將大於 nBlobSize 的數據行數據處理為
SetBlobSizeLimit
BLOB 數據,並透過提供者配置的取用者擁有記憶體中的參考來擷取數據。 此選項適用於具有多個 BLOB 資料行的數據表,而且提供者每個存取子只支援一個ISequentialStream
物件。DBBLOBHANDLING_SKIP:略過(請勿系結)限定為包含 BLOB 的數據行(存取子不會系結或擷取數據行值,但仍會擷取數據行狀態和長度)。
備註
您應該先呼叫 SetBlobHandling
,然後再呼叫 Open
。
建構函式方法 CDynamicAccessor 會將 BLOB 處理值設定為DBBLOBHANDLING_DEFAULT。
CDynamicAccessor::SetBlobSizeLimit
以位元組為單位設定 BLOB 大小上限。
語法
void SetBlobSizeLimit(DBLENGTH nBlobSize);
參數
nBlobSize
指定 BLOB 大小限制。
備註
設定以位元組為單位的 BLOB 大小上限;大於此值的數據行數據會被視為 BLOB。 某些提供者會為數據行提供非常大的大小(例如 2 GB)。 您通常會嘗試將這些數據行系結為 BLOB,而不是嘗試為這個大小的數據行配置記憶體。 如此一來,您就不需要配置所有記憶體,但您仍然可以讀取所有數據,而不必擔心截斷。 不過,在某些情況下,您可能會想要強制 CDynamicAccessor
系結原生數據類型中的大型數據行。 若要這樣做,請在呼叫 之前呼叫 SetBlobSizeLimit
Open
。
建構函式方法 CDynamicAccessor 會將 BLOB 大小上限設定為預設值 8,000 個字節。
CDynamicAccessor::SetLength
設定指定之數據行的長度。
語法
bool SetLength(DBORDINAL nColumn,
DBLENGTH nLength)throw();
bool SetLength(const CHAR* pColumnName,
DBLENGTH nLength) throw();
bool SetLength(const WCHAR* pColumnName,
DBLENGTH nLength) throw();
參數
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
nLength
[in]以位元組為單位的數據行長度。
pColumnName
[in] 指向包含資料行名稱之字元字串的指標。
傳回值
如果成功設定指定的資料行長度,則傳 true
回 。 否則,此函式會傳 false
回 。
CDynamicAccessor::SetStatus
設定指定數據行的狀態。
語法
bool SetStatus(DBORDINAL nColumn,
DBSTATUS status)throw();
bool SetStatus(const CHAR* pColumnName,
DBSTATUS status) throw();
bool SetStatus(const WCHAR* pColumnName,
DBSTATUS status) throw();
參數
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
status
[in]數據行狀態。 如需詳細資訊,請參閱 OLE DB 程式設計人員參考中的 DBSTATUS。
pColumnName
[in] 指向包含資料行名稱之字元字串的指標。
傳回值
如果成功設定指定的資料行狀態,則傳 true
回 。 否則,此函式會傳 false
回 。
CDynamicAccessor::SetValue
將資料儲存至指定的數據行。
語法
template <class ctype>
bool SetValue(
DBORDINAL nColumn,
constctype& data) throw( );
template <class ctype>
bool SetValue(
const CHAR * pColumnName,
const ctype& data) throw( );
template <class ctype>
bool SetValue(
const WCHAR *pColumnName,
const ctype& data) throw( );
參數
ctype
[in]樣板化參數,可處理字串類型 (CHAR*
, ) 以外的任何數據類型, WCHAR*
這需要特殊處理。 GetValue
會根據您在這裡指定的專案,使用適當的數據類型。
pColumnName
[in] 指向包含資料行名稱之字元字串的指標。
data
[in]包含數據的記憶體指標。
nColumn
[in] 資料行編號。 欄號從 1 開始。 如果有任何值,則值為0會參考書籤數據行。
傳回值
如果您想要設定字串數據,請使用 的非範本化版本 GetValue
。 這個方法的非範本版本會傳回 void*
,指向包含指定之數據行數據的緩衝區部分。 如果找不到數據行,則傳回NULL。
對於所有其他數據類型,使用 樣板化版本的 GetValue
比較簡單。 範本化版本會在成功或false
失敗時傳回true
。
另請參閱
OLE DB 消費者範本
OLE DB 消費者範本參考
CAccessor 類別
CDynamicParameterAccessor 類別
CManualAccessor 類別