Compartilhar via


Usar acessadores dinâmicos

Ors acesso dinâmicos permitem que você acesso uma fonte de dados quando você não possui conhecimento do esquema de banco de dados (estrutura subjacente).A biblioteca de modelos OLE DB fornece várias classes para ajudar você a fazer isso.

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

Usando CDynamicAccessor

CDynamicAccessor permite acessar uma fonte de dados quando você não possui conhecimento do esquema de banco de dados (estrutura de base do banco de dados).CDynamicAccessor métodos de obter informações de coluna sistema autônomo nomes de coluna, contagem e tipo de dados. Você usar essas informações de coluna para criar um acessador dinamicamente em time de execução.As informações de coluna são armazenadas em um buffer que é criado e gerenciado por esta classe.Obter dados de buffer usando o GetValue método.

Exemplo

Código

// 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.Ao mesmo tempo em que CDynamicAccessor solicitar dados no formato nativo relatado pelo provedor, CDynamicStringAccessor solicita que o provedor de buscar todos sistema autônomo dados acessados do armazenamento de dados sistema autônomo dados de seqüência de caracteres. Isso é especialmente útil para tarefas simples que não requerem cálculo de valores no armazenamento de dados, sistema autônomo exibir ou imprimir o Sumário do armazenamento de dados.

Use CDynamicStringAccessor métodos para obter informações de coluna. Você usar essas informações de coluna para criar um acessador dinamicamente em time 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 CDynamicStringAccessor::GetString ou armazená-lo ao buffer usando CDynamicStringAccessor::SetString.

Exemplo

Código

// 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 dar suporte a 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 de parâmetro do buffer usando CDynamicParameterAccessor::GetParam and CDynamicParameterAccessor::GetParamType.

Para obter um exemplo que demonstram como usar essa classe para executar um procedimento armazenado do SQL servidor e obter os valores de parâmetro de saída, consulte o artigo do base de dados de conhecimento Q058860, "como: Executar procedimento armazenado usando CDynamicParameterAccessor." Artigos da Base de dados de Conhecimento estão disponível na documentação do Biblioteca MSDN Visual Studio ou em http://suporte.Microsoft.com.

Consulte também

Tarefas

Exemplo de DynamicConsumer: Usa Accessor dinâmico e classes de conjunto de registros de esquema para ler os metadados de um banco de dados

Conceitos

Usar acessadores

Referência

Classe CDynamicAccessor

Classe CDynamicStringAccessor

Classe CDynamicParameterAccessor