Za pomocą dynamicznej akcesorów
Akcesory dynamiczne umożliwiają dostępu do źródła danych, gdy nie znają schematu bazy danych (wewnętrzna struktura).Biblioteka szablonów OLE DB zawiera kilka klas do pomocy, możesz to zrobić.
DynamicConsumer próbki ilustruje sposób użycia klasy akcesor dynamicznych do uzyskania informacji o kolumnie i dynamicznego tworzenia akcesorów.
Przy użyciu CDynamicAccessor
CDynamicAccessor pozwala na dostęp źródła danych, gdy nie wiedzy schematu bazy danych (podstawowej struktury bazy danych).CDynamicAccessormetody uzyskiwania kolumny informacji, takich jak nazwy kolumn, liczba i typ danych.Informacje te kolumny służy do tworzenia akcesor dynamicznie w czasie wykonywania.Kolumna jest przechowywana w buforze, który jest tworzony i zarządzany przez tę klasę.Uzyskania danych z bufora, za pomocą elementu 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 jak works CDynamicAccessor, z wyjątkiem jeden istotny sposób.Podczas gdy CDynamicAccessor żąda danych w formacie macierzystym, zgłoszone przez dostawcę, CDynamicStringAccessor wniosek, że dostawca pobiera wszystkie dane z magazynu danych jako ciąg danych.Jest to szczególnie przydatne w przypadku prostych zadań, które nie wymagają obliczania wartości w magazynie danych, takich jak wyświetlanie lub drukowanie zawartość magazynu danych.
Użyj CDynamicStringAccessor metod, aby uzyskać informacje o kolumnie.Informacje te kolumny służy do tworzenia akcesor dynamicznie w czasie wykonywania.Kolumna jest przechowywana w buforze tworzone i zarządzane przez tę klasę.Uzyskania danych z bufora, za pomocą CDynamicStringAccessor::GetString lub przechowywać go przy użyciu buforu 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 wyjątkiem CDynamicParameterAccessor uzyskuje informacje o parametrach określonych przez wywołanie ICommandWithParameters interfejsu.Dostawca musi obsługiwać ICommandWithParameters dla konsumenta użyć tej klasy.
Parametr jest przechowywana w buforze tworzone i zarządzane przez tę klasę.Uzyskania parametru danych z bufora za pomocą CDynamicParameterAccessor::GetParam i CDynamicParameterAccessor::GetParamType.
Przykładem wykazujące, jak używać tej klasy i wykonaj procedurę SQL Server przechowywane wartości parametru wyjściowego, zobacz artykuł bazy wiedzy Knowledge Base Q058860, "HOWTO: wykonanie procedury przechowywane przy użyciu CDynamicParameterAccessor." Artykuły bazy wiedzy Knowledge Base są dostępne w dokumentacji MSDN Library Visual Studio lub na https://support.microsoft.com.
Zobacz też
Informacje
Klasa CDynamicParameterAccessor