使用动态访问器
借助动态访问器,你可以在不了解数据库架构(基础结构)的情况下访问数据源。 OLE DB 模板库提供了多个类来帮助你。
DynamicConsumer 示例演示了如何使用动态访问器类来获取列信息并动态创建访问器。
使用 CDynamicAccessor
通过 CDynamicAccessor,可以在不知道数据库架构(数据库的基础结构)的情况下访问数据源。 CDynamicAccessor
方法获取列信息,例如列名、计数和数据类型。 使用此列信息在运行时动态创建访问器。 列信息存储在由此类创建和管理的缓冲区中。 使用 GetValue 方法从缓冲区获取数据。
示例:CDynamic 访问器
// Using_Dynamic_Accessors.cpp
// compile with: /c /EHsc
#include <stdio.h>
#include <objbase.h>
#include <atldbcli.h>
int main(int argc, char* argv[] )
{
HRESULT hr = CoInitialize(NULL );
CDataSource ds;
CSession ss;
CTable<CDynamicAccessor> rs;
// The following is an example initialization string:
hr = ds.OpenFromInitializationString(L"Provider=SQLOLEDB.1;"
L"Integrated Security=SSPI;Persist Security Info=False;"
L"Initial Catalog=Loginname;Data Source=your_data_source;"
L"Use Procedure for Prepare=1;Auto Translate=True;"
L"Packet Size=4096;Workstation ID=LOGINNAME01;"
L"Use Encryption for Data=False;"
L"Tag with column collation when possible=False");
hr = ss.Open(ds );
hr = rs.Open(ss, "Shippers" );
hr = rs.MoveFirst();
while(SUCCEEDED(hr ) && hr != DB_S_ENDOFROWSET )
{
for(size_t i = 1; i <= rs.GetColumnCount(); i++ )
{
DBTYPE type;
rs.GetColumnType(i, &type );
printf_s( "Column %d [%S] is of type %d\n",
i, rs.GetColumnName(i ), type );
switch(type )
{
case DBTYPE_WSTR:
printf_s( "value is %S\n",
(WCHAR*)rs.GetValue(i ) );
break;
case DBTYPE_STR:
printf_s( "value is %s\n",
(CHAR*)rs.GetValue(i ) );
default:
printf_s( "value is %d\n",
*(long*)rs.GetValue(i ) );
}
}
hr = rs.MoveNext();
}
rs.Close();
ss.Close();
ds.Close();
CoUninitialize();
return 0;
}
使用 CDynamicStringAccessor
CDynamicStringAccessor 的工作原理与 CDynamicAccessor 类似,除了一个重要的方面。 当 CDynamicAccessor
请求提供程序报告的本机格式的数据时,CDynamicStringAccessor
将请求提供程序将从数据源访问的所有数据作为字符串数据提取。 该过程对于不需要计算数据存储中的值的简单任务特别有用,例如显示或打印数据存储的内容。
使用 CDynamicStringAccessor
方法获取列信息。 使用此列信息在运行时动态创建访问器。 列信息存储在由此类创建和管理的缓冲区中。 使用 CDynamicStringAccessor::GetString 从缓冲区获取数据,或使用 CDynamicStringAccessor::SetString 将数据存储到缓冲区。
示例:CDynamicStringAccessor
// Using_Dynamic_Accessors_b.cpp
// compile with: /c /EHsc
#include <stdio.h>
#include <objbase.h>
#include <atldbcli.h>
int main(int argc, char* argv[] )
{
HRESULT hr = CoInitialize(NULL );
if (hr != S_OK)
{
exit (-1);
}
CDataSource ds;
CSession ss;
CTable<CDynamicStringAccessor> rs;
// The following is an example initialization string:
hr = ds.OpenFromInitializationString(L"Provider=SQLOLEDB.1;"
L"Integrated Security=SSPI;Persist Security Info=False;"
L"Initial Catalog=Loginname;Data Source=your_data_source;"
L"Use Procedure for Prepare=1;Auto Translate=True;"
L"Packet Size=4096;Workstation ID=LOGINNAME01;"
L"Use Encryption for Data=False;"
L"Tag with column collation when possible=False");
hr = ss.Open(ds );
hr = rs.Open(ss, "Shippers" );
hr = rs.MoveFirst();
while(SUCCEEDED(hr ) && hr != DB_S_ENDOFROWSET )
{
for(size_t i = 1; i <= rs.GetColumnCount(); i++ )
{
printf_s( "column %d value is %s\n",
i, rs.GetString(i ) );
}
hr = rs.MoveNext();
}
rs.Close();
ss.Close();
ds.Close();
CoUninitialize();
return 0;
}
使用 CDynamicParameterAccessor
CDynamicParameterAccessor 与 CDynamicAccessor 类似,只是 CDynamicParameterAccessor
通过调用 ICommandWithParameters 接口获取要设置的参数信息。 访问接口必须支持 ICommandWithParameters
以便使用者使用此类。
参数信息存储在由此类创建和管理的缓冲区中。 使用 CDynamicParameterAccessor::GetParam 和 CDynamicParameterAccessor::GetParamType 从缓冲区获取参数数据。
有关演示如何使用此类执行 SQL Server 存储过程并获取输出参数值的示例,请参阅 GitHub 上 Microsoft VCSamples 存储库中的 DynamicConsumer 示例代码。
另请参阅
使用访问器
CDynamicAccessor 类
CDynamicStringAccessor 类
CDynamicParameterAccessor 类
DynamicConsumer 示例