Implementieren eines einfachen Consumers

Der ATL-OLE DB-Consumer-Assistent ist in Visual Studio 2019 und höher nicht verfügbar. Sie können diese Funktionalität weiterhin manuell hinzufügen. Weitere Informationen finden Sie unter Erstellen eines Consumers ohne Assistent.

Die folgenden Themen zeigen, wie Sie die vom MFC-Anwendungsassistenten und ATL-OLE DB-Consumer-Assistenten erstellten Dateien bearbeiten können, um einen einfachen Consumer zu erstellen. Dieses Beispiel besteht aus folgenden Teilen:

Hinweis

Sie können die in diesem Abschnitt beschriebene Consumeranwendung verwenden, um die MyProv- und Provider-Beispielanbieter zu testen.

Hinweis

Um eine Consumeranwendung zum Testen von MyProv (derselbe Anbieter, der unter Erweitern des einfachen schreibgeschützen Anbieters beschrieben ist) zu erstellen, müssen Sie die Lesezeichenunterstützung wie unter Hinzufügen der Lesezeichenunterstützung für den Cosumer beschrieben integrieren.

Abrufen von Daten mit dem Verbraucher

So ändern Sie die Konsolenanwendung zur Verwendung des OLE DB-Consumers

  1. Ändern Sie unter MyCons.cpp den Hauptcode, indem Sie den fettgedruckten Text wie folgt einfügen:

    // 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;
    }
    

Hinzufügen der Textmarkenunterstützung zum Verbraucher

Ein Lesezeichen ist eine Spalte, die Zeilen in der Tabelle eindeutig identifiziert. Normalerweise ist das die Schlüsselspalte. Dies ist jedoch nicht immer der Fall, es ist anbieterspezifisch. In diesem Abschnitt erfahren Sie, wie Sie die Lesezeichenunterstützung hinzufügen. Dazu müssen Sie die folgenden Schritte in der Klasse der Benutzerdatensätze durchführen:

  • Instanziieren Sie die Lesezeichen. Hierbei handelt es sich um Objekte des Typs CBookmark.

  • Fordern Sie eine Lesezeichenspalte vom Anbieter an, indem Sie die Eigenschaft DBPROP_IRowsetLocate festlegen.

  • Fügen Sie der Spaltenübersicht mit dem Makro BOOKMARK_ENTRY einen Lesezeicheneintrag hinzu.

Mit den vorherigen Schritten erhalten Sie Lesezeichenunterstützung und ein Lesezeichenobjekt, mit dem Sie arbeiten können. Dieses Codebeispiel veranschaulicht ein Lesezeichen wie folgt:

  • Öffnen Sie eine Datei zum Schreiben.

  • Geben Sie die Rowsetdaten in die Datei zeilenweise aus.

  • Verschieben Sie den Rowsetsursor auf das Lesezeichen, indem Sie MoveToBookmark aufrufen.

  • Geben Sie die mit Lesezeichen versehene Zeile aus, und hängen Sie sie an das Ende der Datei an.

Hinweis

Wenn Sie diese Consumeranwendung verwenden, um die Provider-Beispielanbieteranwendung zu testen, lassen Sie die in diesem Abschnitt beschriebene Lesezeichenunterstützung weg.

So instanziieren Sie das Lesezeichen

  1. Der Accessor muss ein Objekt des Typs CBookmark enthalten. Der nSize-Parameter gibt die Größe des Lesezeichenpuffers in Bytes an (in der Regel 4 für 32-Bit-Plattformen und 8 für 64-Bit-Plattformen). Fügen Sie die folgende Deklaration zu den Spaltendatenmembern in der Benutzerdatensatz-Klasse hinzu:

    //////////////////////////////////////////////////////////////////////
    // Products.h
    class CProductsAccessor
    {
    public:
       CBookmark<4> m_bookmark;   // Add bookmark declaration
       LONG m_ProductID;
       ...
    

So fordern Sie eine Lesezeichenspalte vom Anbieter an

  1. Fügen Sie den folgenden Code in der GetRowsetProperties-Methode der Benutzerdatensatz-Klasse hinzu:

    // 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);
    }
    

So fügen Sie einen Lesezeicheneintrag zur Spaltenzuordnung hinzu

  1. Fügen Sie den folgenden Eintrag zur Spaltenzuordnung in der Benutzerdatensatz-Klasse hinzu:

    // 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()
    

So verwenden Sie eine Lesezeichen in Ihrem Hauptcode

  1. Ändern Sie in der MyCons.cpp-Datei aus der zuvor erstellten Konsolenanwendung den Hauptcode wie folgt. Um Lesezeichen verwenden zu können, muss der Hauptcode sein eigenes Lesezeichenobjekt (myBookmark) instanziieren; dies ist ein anderes Lesezeichen als das im Accessor (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;
    }
    

Weitere Informationen über Lesezeichen finden Sie unter Verwenden von Lesezeichen. Beispiele für Lesezeichen finden Sie auch in Aktualisieren von Rowsets.

Siehe auch

Erstellen eines OLE DB-Consumers mit einem Assistenten