Używanie dynamicznych metod dostępu
Akcesory dynamiczne umożliwiają dostęp do źródła danych, gdy nie znasz schematu bazy danych (podstawową strukturę).Biblioteka szablonów OLE DB dostarcza kilka klas, aby ułatwić wykonywanie tego zadania.
DynamicConsumer przykładowy pokazuje, jak używać klasy akcesor dynamicznych do uzyskiwania informacji o kolumnie i dynamicznego tworzenia akcesorów.
Przy użyciu CDynamicAccessor
CDynamicAccessor pozwala na dostęp do źródła danych, gdy nie znasz schematu bazy danych (podstawowej struktury bazy danych).CDynamicAccessormetody uzyskiwania informacji o kolumnie nazwy kolumn, liczba i typ danych.Informacje te kolumny umożliwia tworzenie akcesor dynamicznie w czasie wykonywania.Informacje kolumny są przechowywane w buforze, który jest tworzony i zarządzany przez tę klasę.Uzyskania danych używającego buforu GetValue metody.
Przykład
Kod
// 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;
}
Przy użyciu CDynamicStringAccessor
CDynamicStringAccessor działa jak CDynamicAccessor, z wyjątkiem w jeden istotny sposób.Podczas gdy CDynamicAccessor zażąda danych w formacie macierzystym, zgłaszane przez dostawcę, CDynamicStringAccessor żąda, czy dostawca pobierać wszystkie dane udostępniane z magazynu danych jako ciąg danych.Jest to szczególnie przydatne dla prostych zadań, które nie wymagają obliczania wartości w magazynie danych, takich jak wyświetlanie lub drukowanie zawartość magazynu danych.
Użycie CDynamicStringAccessor metody do uzyskiwania informacji o kolumnie.Informacje te kolumny umożliwia tworzenie akcesor dynamicznie w czasie wykonywania.Informacje kolumny są przechowywane w buforze tworzone i zarządzane przez tę klasę.Uzyskania danych używającego buforu CDynamicStringAccessor::GetString lub przechowywać go do buforu za pomocą CDynamicStringAccessor::SetString.
Przykład
Kod
// 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;
}
Przy użyciu CDynamicParameterAccessor
CDynamicParameterAccessor jest podobny do CDynamicAccessor, z tym wyjątkiem, że CDynamicParameterAccessor uzyskuje informacje o parametrach określonych przez wywołanie ICommandWithParameters interfejsu.Dostawca musi obsługiwać ICommandWithParameters dla konsumenta użyć tej klasy.
Informacje na temat parametrów jest przechowywany w buforze tworzone i zarządzane przez tę klasę.Uzyskania parametru danych z bufora za pomocą CDynamicParameterAccessor::GetParam i CDynamicParameterAccessor::GetParamType.
Na przykład, ukazujące sposób używać tej klasy do wykonania procedury przechowywane programu SQL Server i uzyskać wartości parametrów wyjściowych, zobacz artykuł bazy wiedzy Knowledge Base Q058860, "PORADNIKI: wykonanie procedury przechowywanej za pomocą CDynamicParameterAccessor." Artykuły bazy wiedzy są dostępne w dokumentacji MSDN Library programu Visual Studio lub w https://support.microsoft.com.
Zobacz też
Informacje
CDynamicStringAccessor — Klasa
CDynamicParameterAccessor — Klasa