Usar acessadores dinâmicos

Acessadores dinâmicos permitem que você acessar uma fonte de dados quando você não possui conhecimento do esquema de banco de dados (estrutura de base). A biblioteca de modelos OLE DB fornece várias classes para ajudá-lo a fazer isso.

O DynamicConsumer exemplo mostra como usar as classes de acessador dinâmico para obter informações de coluna e criar dinamicamente acessadores.

Usando CDynamicAccessor

CDynamicAccessor permite que você acesse uma fonte de dados quando você não possui conhecimento do esquema de banco de dados (estrutura de base do banco de dados). CDynamicAccessormétodos de obtêm informações de coluna como nomes de coluna, a contagem e o tipo de dados. Você pode usar essas informações de coluna para criar um acessador dinamicamente em tempo de execução. As informações de coluna são armazenadas em um buffer que é criado e gerenciado por esta classe. Obter dados de uso de buffer no GetValue método.

Example

Code

// 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;
}

Usando CDynamicStringAccessor

CDynamicStringAccessor funciona como CDynamicAccessor, exceto em um aspecto importante. Enquanto CDynamicAccessor solicitações de dados no formato nativo relatado pelo provedor, CDynamicStringAccessor armazenam de solicitações que o provedor de buscar todos os dados acessados a partir dos dados como dados de seqüência de caracteres. Isso é especialmente útil para tarefas simples que não requerem o cálculo dos valores no armazenamento de dados, como, por exemplo, exibir ou imprimir o conteúdo do armazenamento de dados.

Use CDynamicStringAccessor métodos para obter informações de coluna. Você pode usar essas informações de coluna para criar um acessador dinamicamente em tempo de execução. As informações de coluna são armazenadas em um buffer criado e gerenciado por esta classe. Obter dados de buffer usando o CDynamicStringAccessor::GetString ou armazená-lo ao buffer usando CDynamicStringAccessor::SetString.

Example

Code

// 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;

}

Usando CDynamicParameterAccessor

CDynamicParameterAccessor é semelhante a CDynamicAccessor, exceto que CDynamicParameterAccessor obtém informações de parâmetro a ser definida, chamando o ICommandWithParameters interface. O provedor deve oferecer suporte ICommandWithParameters para o consumidor usar essa classe.

As informações de parâmetro são armazenadas em um buffer criado e gerenciado por esta classe. Obter dados do parâmetro do buffer usando CDynamicParameterAccessor::GetParam e CDynamicParameterAccessor::GetParamType.

Para obter um exemplo que demonstram como usar essa classe para executar um procedimento armazenado de de SQL Server e obter os valores de parâmetro de saída, consulte o artigo Q058860, "HOWTO: Execute o procedimento armazenado usando CDynamicParameterAccessor." Artigos do Knowledge Base estão disponíveis na documentação do Visual Studio do Biblioteca MSDN ou em https://support.microsoft.com.

Consulte também

Tarefas

DynamicConsumer Sample: Uses Dynamic Accessor and Schema Rowset Classes to Read Metadata from a Database

Referência

CDynamicAccessor Class

CDynamicStringAccessor Class

CDynamicParameterAccessor Class

Conceitos

Usar acessadores