Použití dynamických přístupových objektů
Dynamické přístupové objekty umožňují přístup ke zdroji dat, pokud nemáte žádné znalosti o schématu databáze (podkladové struktuře). Knihovna šablon OLE DB poskytuje několik tříd, které vám pomůžou.
Ukázka DynamicConsumer ukazuje, jak pomocí tříd dynamického přístupového objektu získat informace o sloupcích a dynamicky vytvářet přístupové objekty.
Použití CDynamicAccessoru
CDynamicAccessor umožňuje přístup ke zdroji dat, pokud nemáte žádné znalosti o schématu databáze (základní struktura databáze). CDynamicAccessor
metody získávají informace o sloupcích, jako jsou názvy sloupců, počet a datový typ. Tyto informace o sloupci slouží k dynamickému vytvoření přístupového objektu za běhu. Informace o sloupci jsou uloženy ve vyrovnávací paměti, která je vytvořena a spravována touto třídou. Získejte data z vyrovnávací paměti pomocí metody GetValue .
Příklad: Přístupové objekty 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;
}
Použití CDynamicStringAccessor
CDynamicStringAccessor funguje jako CDynamicAccessor, s výjimkou jednoho důležitého způsobu. Zatímco CDynamicAccessor
požaduje data v nativním formátu hlášeného poskytovatelem, vyžaduje, CDynamicStringAccessor
aby zprostředkovatel načítal všechna data přístupná z úložiště dat jako řetězcová data. Tento proces je užitečný zejména pro jednoduché úlohy, které nevyžadují výpočet hodnot v úložišti dat, například zobrazení nebo tisk obsahu úložiště dat.
K získání informací o sloupci použijte CDynamicStringAccessor
metody. Tyto informace o sloupci slouží k dynamickému vytvoření přístupového objektu za běhu. Informace o sloupci jsou uloženy ve vyrovnávací paměti vytvořené a spravované touto třídou. Získejte data z vyrovnávací paměti pomocí CDynamicStringAccessor::GetString nebo je uložte do vyrovnávací paměti pomocí CDynamicStringAccessor::SetString.
Příklad: 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;
}
Použití CDynamicParameterAccessoru
CDynamicParameterAccessor je podobný CDynamicAccessor s tím rozdílem, že získá informace o parametrech, které CDynamicParameterAccessor
mají být nastaveny voláním ICommandWithParameters rozhraní. Poskytovatel musí podporovat ICommandWithParameters
příjemce, aby tuto třídu používal.
Informace o parametrech jsou uloženy ve vyrovnávací paměti vytvořené a spravované touto třídou. Získání dat parametrů z vyrovnávací paměti pomocí CDynamicParameterAccessor::GetParam a CDynamicParameterAccessor::GetParamType.
Příklad ukazující, jak tuto třídu použít ke spuštění uložené procedury SQL Serveru a získání hodnot výstupních parametrů, viz ukázkový kód DynamicConsumer v úložišti Microsoft VCSamples na GitHubu.
Viz také
Použití přístupových objektů
CDynamicAccessor – třída
CDynamicStringAccessor – třída
CDynamicParameterAccessor – třída
Ukázka DynamicConsumer