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 值之一。
注解
有关数据类型 DBORDINAL
、DBCOLUMNINFO
和 OLECHAR
的信息,请参阅《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 数据,并通过ISequentialStream
或IStream
对象检索。 此选项将尝试将所有包含大于 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 类