Utilisation d’accesseurs dynamiques
Les accesseurs dynamiques vous permettent d’accéder à une source de données quand vous n’avez aucune connaissance du schéma de base de données (structure sous-jacente). La bibliothèque de modèles OLE DB fournit plusieurs classes pour vous aider.
L’exemple DynamicConsumer montre comment utiliser les classes d’accesseur dynamique pour obtenir des informations de colonne et créer dynamiquement des accesseurs.
Utilisation de CDynamicAccessor
CDynamicAccessor vous permet d’accéder à une source de données quand vous n’avez aucune connaissance du schéma de base de données (structure sous-jacente de la base de données). CDynamicAccessor
les méthodes obtiennent des informations de colonne telles que les noms de colonnes, le nombre et le type de données. Vous utilisez ces informations de colonne pour créer un accesseur dynamiquement au moment de l’exécution. Les informations de colonne sont stockées dans une mémoire tampon créée et gérée par cette classe. Obtenez des données à partir de la mémoire tampon à l’aide de la méthode GetValue .
Exemple : accesseurs 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;
}
Utilisation de CDynamicStringAccessor
CDynamicStringAccessor fonctionne comme CDynamicAccessor, sauf d’une manière importante. Lors CDynamicAccessor
de la demande de données au format natif signalé par le fournisseur, CDynamicStringAccessor
demande au fournisseur d’extraire toutes les données accessibles à partir du magasin de données en tant que données de chaîne. Le processus est particulièrement utile pour les tâches simples qui ne nécessitent pas de calcul de valeurs dans le magasin de données, telles que l’affichage ou l’impression du contenu du magasin de données.
Utilisez des CDynamicStringAccessor
méthodes pour obtenir des informations sur les colonnes. Vous utilisez ces informations de colonne pour créer un accesseur dynamiquement au moment de l’exécution. Les informations de colonne sont stockées dans une mémoire tampon créée et gérée par cette classe. Obtenez des données à partir de la mémoire tampon à l’aide de CDynamicStringAccessor ::GetString ou stockez-les dans la mémoire tampon à l’aide de CDynamicStringAccessor ::SetString.
Exemple : 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;
}
Utilisation de CDynamicParameterAccessor
CDynamicParameterAccessor est similaire à CDynamicAccessor, sauf qu’il CDynamicParameterAccessor
obtient des informations de paramètre à définir en appelant l’interface ICommandWithParameters . Le fournisseur doit prendre en charge ICommandWithParameters
pour permettre au consommateur d’utiliser cette classe.
Les informations sur les paramètres sont stockées dans une mémoire tampon créée et gérée par cette classe. Obtenez des données de paramètre à partir de la mémoire tampon à l’aide de CDynamicParameterAccessor ::GetParam et CDynamicParameterAccessor ::GetParamType.
Pour obtenir un exemple illustrant comment utiliser cette classe pour exécuter une procédure stockée SQL Server et obtenir les valeurs des paramètres de sortie, consultez l’exemple de code DynamicConsumer dans le référentiel Microsoft VCSamples sur GitHub.
Voir aussi
Utilisation des accesseurs
CDynamicAccessor, classe
CDynamicStringAccessor, classe
CDynamicParameterAccessor, classe
Exemple DynamicConsumer