Použití dynamických přistupujících objektů
Dynamicky přístupující objekty Vám povolují přístup ke zdroji dat, když nemáte žádné znalosti o schématu databáze (základní strukturu). Knihovna šablon technologie OLE DB obsahuje několik tříd, které Vám to pomohou provést.
Příklad DynamicConsumer ukazuje, jak používat třídy dynamicky přistupujícího objektu k získání informací o sloupci a dynamicky vytvářet přístupové objekty.
Použití CDynamicAccessor
CDynamicAccessor vám umožňí přístup ke zdroji dat, když nemáte žádné znalosti o schématu databáze (základní databázovou strukturu). Metody CDynamicAccessor získávají informace o sloupci jako jsou názvy sloupců, počet a datový typ. Tyto informace sloupce můžete použít k vytvoření dynamicky přistupujícího objektu za běhu. Informace sloupce jsou uloženy ve vyrovnávací paměti, která je vytvořena a spravována touto třídou. Data získáte z vyrovnávací paměti, pomocí metody GetValue.
Příklad
Kód
// 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;
}
Použití CDynamicStringAccessor
CDynamicStringAccessor pracuje jako CDynamicAccessor, s výjimkou jednoho důležitého způsobu. Zatímco CDynamicAccessor požaduje data v nativním formátu, vykazována zprostředkovatelem, CDynamicStringAccessor požaduje, aby zprostředkovatel načítal všechna data z úložiště dat jako řetězcová data. To je užitečné zejména pro jednoduché úkoly, které nevyžadují výpočet hodnot v úložišti dat, jako je zobrazení nebo tisk obsahu úložiště dat.
Použití metod CDynamicStringAccessor k získání informací o sloupci. Tyto informace sloupce můžete použít k vytvoření dynamicky přistupujícího objektu za běhu. Informace sloupce jsou uloženy ve vyrovnávací paměti a spravovány touto třídou. Data získáte z vyrovnávací paměti, pomocí CDynamicStringAccessor::GetString nebo je uložíte do vyrovnávací paměti, pomocí CDynamicStringAccessor::SetString.
Příklad
Kód
// 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;
}
Použití CDynamicParameterAccessor
CDynamicparametraccessor je podobná s CDynamicAccessor, kromě toho, že CDynamicParameterAccessor získá informace o parametrech, které mají být nastaveny voláním rozhraní ICommandWithParameters. Zprostředkovatel musí podporovat ICommandWithParameters pro příjemce k použití této třídy.
Informace o parametrech jsou uloženy ve vyrovnávací paměti a spravovány touto třídou. Data parametru získáte z vyrovnávací paměti, pomocí CDynamicParameterAccessor::GetParam a CDynamicParameterAccessor::GetParamType.
Pro příklad ukazující, jak používat tuto třídu ke spuštění uložené procedury SQL Serveru a získání hodnoty výstupního parametru, naleznete v článku znalostní báze Q058860, "Postupy: Spuštění uložené procedury pomocí CDynamicParameterAccessor." Články znalostní báze Knowledge Base jsou k dispozici v dokumentaci k aplikaci Visual Studio knihovny MSDN nebo na https://support.microsoft.com.
Viz také
Úkoly
Odkaz
CDynamicParameterAccessor Class