Implémentation d'un consommateur simple
L’Assistant Consommateur OLE DB ATL n’est pas disponible dans Visual Studio 2019 et versions ultérieures. Vous pouvez toujours ajouter la fonctionnalité manuellement. Pour plus d’informations, consultez Création d’un consommateur sans utiliser l’Assistant.
Les rubriques suivantes montrent comment modifier les fichiers créés par l’Assistant Application MFC et l’Assistant Consommateur OLE DB ATL pour créer un consommateur simple. Cet exemple comporte les parties suivantes :
Récupération des données avec le consommateur montre comment implémenter le code dans le consommateur qui lit toutes les données, ligne par ligne, à partir d’une table de base de données.
Ajout de la prise en charge de signet au consommateur montre comment ajouter la prise en charge des signets au consommateur.
Remarque
Vous pouvez utiliser l’application consommateur décrite dans cette section pour tester les exemples de fournisseur MyProv
et Provider
.
Remarque
Pour générer une application consommateur pour tester MyProv
(le même fournisseur que celui décrit dans Amélioration du fournisseur simple accessible en lecture seule), vous devez inclure la prise en charge des signets comme décrit dans Ajout de la prise en charge de signet au consommateur.
Récupération de données avec le consommateur
Pour modifier l’application de console afin d’utiliser le consommateur OLE DB
Dans
MyCons.cpp
, modifiez le code principal en insérant le texte en gras comme suit :// MyCons.cpp : Defines the entry point for the console application. // #include "pch.h" // "stdafx.h" in Visual Studio 2017 and earlier #include "Products.h" ... int main(int argc, char* argv[]) { HRESULT hr = CoInitialize(NULL); // Instantiate rowset CProducts rs; hr = rs.OpenAll(); ATLASSERT(SUCCEEDED(hr ) ); hr = rs.MoveFirst(); // Iterate through the rowset while(SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) { // Print out the column information for each row printf("Product ID: %d, Name: %s, Unit Price: %d, Quantity per Unit: %d, Units in Stock %d, Reorder Level %d\n", rs.m_ProductID, rs.m_ProductName, rs.m_UnitPrice, rs.m_QuantityPerUnit, rs.m_UnitsInStock, rs.m_ReorderLevel ); hr = rs.MoveNext(); } rs.Close(); rs.ReleaseCommand(); CoUninitialize(); return 0; }
Ajout de la prise en charge des signets au consommateur
Un signet est une colonne qui identifie de façon unique les lignes dans le tableau. Il s’agit en général la colonne clé, mais ce n’est pas toujours le cas (ce point est spécifique au fournisseur). Cette section vous montre comment ajouter la prise en charge des signets. Pour ce faire, vous devez effectuer les étapes suivantes dans la classe d’enregistrement utilisateur :
Instanciez les signets. Il s’agit d’objets de type CBookmark.
Demandez une colonne de signet à partir du fournisseur en définissant la propriété
DBPROP_IRowsetLocate
.Ajoutez une entrée de signet dans le mappage de colonnes à l’aide de la macro BOOKMARK_ENTRY.
Grâce aux étapes précédentes, vous disposez de la prise en charge des signets et d’un objet signet avec lequel vous pouvez travailler. Cet exemple de code montre un signet comme suit :
Ouvrez un fichier en écriture.
Sortez les données d’ensemble de lignes dans le fichier ligne par ligne.
Déplacez le curseur de l’ensemble de lignes vers le signet en appelant MoveToBookmark.
Sortez la ligne marquée par un signet et ajoutez-la à la fin du fichier.
Remarque
Si vous utilisez cette application consommateur pour tester l’exemple d’application de fournisseur Provider
, ignorez la prise en charge de signet décrite dans cette section.
Pour instancier le signet
L’accesseur doit contenir un objet de type CBookmark. Le paramètre nSize spécifie la taille de la mémoire tampon du signet en octets (généralement 4 pour les plateformes 32 bits et 8 pour les plateformes 64 bits). Ajoutez la déclaration suivante pour les membres de données de colonne dans la classe d’enregistrement utilisateur :
////////////////////////////////////////////////////////////////////// // Products.h class CProductsAccessor { public: CBookmark<4> m_bookmark; // Add bookmark declaration LONG m_ProductID; ...
Pour demander une colonne de signet à partir du fournisseur
Ajoutez le code suivant dans la classe d’enregistrement utilisateur en suivant la méthode
GetRowsetProperties
:// Set the DBPROP_IRowsetLocate property. void GetRowsetProperties(CDBPropSet* pPropSet) { pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL); pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL); // Add DBPROP_IRowsetLocate property to support bookmarks pPropSet->AddProperty(DBPROP_IRowsetLocate, true); }
Pour ajouter une entrée de signet dans le mappage de colonnes
Ajoutez l’entrée suivante au mappage de colonne dans la classe d’enregistrement :
// Set a bookmark entry in the column map. BEGIN_COLUMN_MAP(CProductsAccessor) BOOKMARK_ENTRY(m_bookmark) // Add bookmark entry COLUMN_ENTRY_LENGTH_STATUS(1, m_ProductID, m_dwProductIDLength, m_dwProductIDStatus) COLUMN_ENTRY_LENGTH_STATUS(2, m_ProductName, m_dwProductNameLength, m_dwProductNameStatus) ... END_COLUMN_MAP()
Pour ajouter un signet dans votre code principal
Dans le fichier
MyCons.cpp
de l’application de console que vous avez créée précédemment, modifiez le code principal comme suit. Pour utiliser des signets, le code principal doit instancier son propre objet signet (myBookmark
). Il s’agit d’un signet différent de celui de l’accesseur (m_bookmark
)./////////////////////////////////////////////////////////////////////// // MyCons.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Products.h" #include <iostream> #include <fstream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr = CoInitialize(NULL); // Instantiate rowset CProducts rs; hr = rs.OpenAll(); hr = rs.MoveFirst(); // Cast CURRENCY m_UnitPrice to a long value LONGLONG lPrice = rs.m_UnitPrice.int64; // Open file output.txt for writing in overwrite mode ofstream outfile( "C:\\output.txt", ios::out ); if (!outfile) // Test for invalid file return -1; // Instantiate a bookmark object myBookmark for the main code CBookmark<4> myBookmark; int nCounter = 0; // Iterate through the rowset and output column data to output.txt row by row // In the file, mark the beginning of this set of data: outfile << "initial row dump" << endl; while(SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) { nCounter++; if(nCounter == 5 ) myBookmark = rs.m_bookmark; // Output the column information for each row: outfile << rs.m_ProductID << rs.m_ProductName << lPrice << rs.m_QuantityPerUnit << rs.m_UnitsInStock << rs.m_ReorderLevel << endl; hr = rs.MoveNext(); } // Move cursor to bookmark hr = rs.MoveToBookmark(myBookmark); // Iterate through the rowset and output column data to output.txt row by row // In the file, mark the beginning of this set of data: outfile << "row dump starting from bookmarked row" << endl; while(SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) { // Output the column information for each row outfile << rs.m_ProductID << rs.m_ProductName << lPrice << rs.m_QuantityPerUnit << rs.m_UnitsInStock << rs.m_ReorderLevel << endl; hr = rs.MoveNext(); } rs.CloseAll(); CoUninitialize(); return 0; }
Pour plus d’informations sur les signets, consultez Utilisation des signets. Des exemples de signets sont également affichés dans Mise à jour des ensembles de lignes.