CDynamicAccessor 类

使您可以在不知道数据库架构(数据库的基础结构)的情况下访问数据源。

语法

class CDynamicAccessor : public CAccessorBase

要求

标头: atldbcli.h

成员

方法

名称 描述
AddBindEntry 重写默认访问器时,将绑定项添加到输出列。
CDynamicAccessor 实例化并初始化 CDynamicAccessor 对象。
Close 取消绑定所有列,释放分配的内存,然后释放类中的 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();

参数

info
[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 值之一。

注解

有关数据类型 DBORDINALDBCOLUMNINFOOLECHAR 的信息,请参阅《OLE DB 程序员参考》中的 IColumnsInfo::GetColumnInfo

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 的模板版本更简单。 模板化版本在成功时返回 true,在失败时返回 false

备注

使用非模板化版本返回包含字符串的列,使用模板化版本返回包含其他数据类型的列。

在调试模式下,如果 pData 的大小不等于它指向的列的大小,你将得到一个断言。

CDynamicAccessor::SetBlobHandling

设置当前行的 BLOB 处理值。

语法

bool SetBlobHandling(DBBLOBHANDLINGENUM eBlobHandling);

参数

eBlobHandling
指定处理 BLOB 数据的方式。 该参数采用以下值:

  • DBBLOBHANDLING_DEFAULT:将大于 nBlobSize(由 SetBlobSizeLimit 设置)的列数据处理为 BLOB 数据,并通过 ISequentialStreamIStream 对象检索。 此选项将尝试将所有包含大于 nBlobSize 或列为 DBTYPE_IUNKNOWN 的数据的列绑定为 BLOB 数据。

  • 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 在其本机数据类型中绑定大型列。 为此,请在调用 Open 之前先调用 SetBlobSizeLimit

构造方法 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 的模板版本更简单。 模板化版本在成功时返回 true,在失败时返回 false

另请参阅

OLE DB 使用者模板
OLE DB 使用者模板参考
CAccessor 类
CDynamicParameterAccessor 类
CManualAccessor 类