Usando acessadores dinâmicos
Acessadores dinâmicos permitem que você acessar uma fonte de dados quando você não possui conhecimento do esquema do banco de dados (subjacente estrutura).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 dinamicamente cria acessadores.
Usando CDynamicAccessor
CDynamicAccessor lhe permite acessar uma fonte de dados quando você não possui conhecimento do esquema do banco de dados (estrutura de base do banco de dados).CDynamicAccessormétodos de obtêm informações de coluna como nomes de coluna, contagem e 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 do 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 uma maneira importante.Enquanto CDynamicAccessor solicita dados no formato nativo relatado pelo provedor de CDynamicStringAccessor solicita que o provedor de busca todos os dados acessados do armazenamento de dados como dados de cadeia de caracteres.Isso é especialmente útil para tarefas simples que não exigem o cálculo dos valores no armazenamento de dados, como 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 do buffer usando CDynamicStringAccessor::GetString ou armazená-lo para o 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 definido chamando o ICommandWithParameters interface.O provedor deve 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 de parâmetro de buffer usando CDynamicParameterAccessor::GetParam e CDynamicParameterAccessor::GetParamType.
Para obter um exemplo demonstrar como usar essa classe para executar um procedimento SQL Server armazenado e obter os valores de parâmetro de saída, consulte o artigo Q058860, "HOWTO: executar procedimento armazenado usando CDynamicParameterAccessor." Artigos da Base de dados de Conhecimento estão disponíveis na documentação do Biblioteca MSDN Visual Studio ou em https://support.microsoft.com.
Consulte também
Referência
Classe CDynamicParameterAccessor