Partilhar via


Usando acessadores dinâmicos

Os acessadores dinâmicos permitem que você acesse uma fonte de dados quando não tiver conhecimento do esquema de banco de dados (estrutura subjacente). A biblioteca de modelos OLE DB fornece várias classes para ajudar você.

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

Usar o CDynamicAccessor

O CDynamicAccessor permite que você acesse uma fonte de dados quando não tiver conhecimento do esquema de banco de dados (a estrutura subjacente do banco de dados). Os métodos CDynamicAccessor obtêm informações como nomes de coluna, contagem e tipo de dados. Use essas informações de coluna para criar um acessador dinamicamente em tempo de execução. As informações da coluna são armazenadas em um buffer que é criado e gerenciado por essa classe. Obtenha dados do buffer usando o método GetValue.

Exemplo: acessadores 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;
}

Usar o CDynamicStringAccessor

O CDynamicStringAccessor funciona como o CDynamicAccessor, exceto por uma diferença importante. Enquanto o CDynamicAccessor solicita dados no formato nativo relatado pelo provedor, CDynamicStringAccessor solicita que o provedor busque todos os dados acessados do armazenamento de dados como dados de cadeia de caracteres. O processo é especialmente útil para tarefas simples que não exigem cálculo de valores no armazenamento de dados, como exibir ou imprimir o conteúdo de armazenamento de dados.

Use métodos CDynamicStringAccessor para obter informações de coluna. Use essas informações de coluna para criar um acessador dinamicamente em tempo de execução. As informações da coluna são armazenadas em um buffer criado e gerenciado por essa classe. Obtenha dados do buffer usando CDynamicStringAccessor::GetString ou armazene-os no buffer usando CDynamicStringAccessor::SetString.

Exemplo: 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;
}

Usar CDynamicParameterAccessor

O CDynamicParameterAccessor é semelhante ao CDynamicAccessor, exceto que CDynamicParameterAccessor obtém informações de parâmetro a serem definidas chamando a interface ICommandWithParameters. O provedor precisa dar suporte a ICommandWithParameters para que o consumidor use essa classe.

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

Para obter um exemplo que demonstra como usar essa classe para executar um procedimento armazenado do SQL Server e obter os valores de parâmetro de saída, confira o código de exemplo DynamicConsumer no repositório Microsoft VCSamples no GitHub.

Confira também

Usando acessadores
Classe CDynamicAccessor
Classe CDynamicStringAccessor
Classe CDynamicParameterAccessor
Exemplo de DynamicConsumer