Implementazione di un consumer semplice

La Creazione guidata consumer OLE DB ATL non è disponibile in Visual Studio 2019 e versioni successive. È comunque possibile aggiungere la funzionalità manualmente. Per altre informazioni, vedere Creazione di un consumer senza utilizzare una procedura guidata.

Gli argomenti seguenti illustrano come modificare i file creati dalla Creazione guidata applicazione MFC e dalla Creazione guidata consumer OLE DB ATL per creare un consumer semplice. L'esempio è composto dalle parti seguenti:

Nota

È possibile usare l'applicazione consumer descritta in questa sezione per testare i provider di esempio MyProv e Provider.

Nota

Per creare un'applicazione consumer per testare MyProv, ovvero lo stesso provider descritto in Miglioramento di un provider semplice in sola lettura, è necessario includere il supporto dei segnalibri come descritto in Aggiunta del supporto di segnalibri al consumer.

Recupero di dati con il consumer

Per modificare l'applicazione console per usare il consumer OLE DB

  1. In MyCons.cpp modificare il codice principale inserendo il testo in grassetto, come indicato di seguito:

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

Aggiunta del supporto dei segnalibri al consumer

Un segnalibro è una colonna che identifica in modo univoco le righe della tabella. In genere si tratta della colonna chiave, ma non è sempre così. La colonna è specifica del provider. Questa sezione illustra come aggiungere il supporto dei segnalibri. A tale scopo, è necessario eseguire la procedura seguente nella classe di record utente:

  • Creare un'istanza dei segnalibri. Si tratta di oggetti di tipo CBookmark.

  • Richiedere una colonna segnalibro al provider impostando la proprietà DBPROP_IRowsetLocate.

  • Aggiungere una voce segnalibro al mapping delle colonne usando la macro BOOKMARK_ENTRY.

La procedura precedente fornisce il supporto dei segnalibri e un oggetto segnalibro con cui lavorare. L'esempio di codice seguente illustra un segnalibro con i passaggi seguenti:

  • Aprire un file per la scrittura.

  • Restituire come output nel file i dati del set di righe, riga per riga.

  • Spostare il cursore del set di righe al segnalibro chiamando MoveToBookmark.

  • Restituire come output la riga con il segnalibro, aggiungendola alla fine del file.

Nota

Se si usa questa applicazione consumer per testare l'applicazione del provider di esempio Provider, omettere il supporto dei segnalibri descritto in questa sezione.

Per creare un'istanza del segnalibro

  1. La funzione di accesso deve contenere un oggetto di tipo CBookmark. Il parametro nSize specifica la dimensione del buffer dei segnalibri in byte, in genere 4 per le piattaforme a 32 bit e 8 per le piattaforme a 64 bit. Aggiungere la dichiarazione seguente ai membri dati delle colonne nella classe di record utente:

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

Per richiedere una colonna segnalibro al provider

  1. Aggiungere il codice seguente nel metodo GetRowsetProperties nella classe di record utente:

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

Per aggiungere una voce segnalibro al mapping delle colonne

  1. Aggiungere la voce seguente al mapping delle colonne nella classe di record utente:

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

Per usare un segnalibro nel codice principale

  1. Nel file MyCons.cpp dell'applicazione console creata in precedenza modificare il codice principale come indicato di seguito. Per usare i segnalibri, il codice principale deve creare un'istanza di un proprio oggetto segnalibro (myBookmark). Si tratta di un segnalibro diverso da quello nella funzione di accesso (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;
    }
    

Per altre informazioni sui segnalibri, vedere Using Bookmarks (Uso dei segnalibri). Esempi di segnalibri sono anche disponibili in Aggiornamento dei set di righe.

Vedi anche

Creazione di un consumer OLE DB tramite la procedura guidata