使用动态访问器

借助动态访问器,你可以在不了解数据库架构(基础结构)的情况下访问数据源。 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

CDynamicParameterAccessorCDynamicAccessor 类似,只是 CDynamicParameterAccessor 通过调用 ICommandWithParameters 接口获取要设置的参数信息。 访问接口必须支持 ICommandWithParameters 以便使用者使用此类。

参数信息存储在由此类创建和管理的缓冲区中。 使用 CDynamicParameterAccessor::GetParamCDynamicParameterAccessor::GetParamType 从缓冲区获取参数数据。

有关演示如何使用此类执行 SQL Server 存储过程并获取输出参数值的示例,请参阅 GitHub 上 Microsoft VCSamples 存储库中的 DynamicConsumer 示例代码。

另请参阅

使用访问器
CDynamicAccessor 类
CDynamicStringAccessor 类
CDynamicParameterAccessor 类
DynamicConsumer 示例