Implementowanie prostego konsumenta

W następujących tematach opisano, jak edytować pliki utworzone przez Kreatora aplikacji MFC i ATL OLE DB konsumenta kreatora, aby utworzyć prosty konsumenta.W tym przykładzie zawiera następujące segmenty:

  • "Pobieranie danych z konsumentem" pokazuje jak zaimplementować kod konsumpcyjnych, który odczytuje dane, wiersz po wierszu z tabeli bazy danych.

  • "Dodawanie pozycję obsługuje zakładki do konsumenta" pokazuje, jak dodać obsługę zakładek do konsumenta.

  • "Dodawanie obsługi języka XML dla konsumenta" przedstawiono sposób modyfikowania kodu konsumenta do wysyłania danych pobranych wierszy w postaci danych XML.

[!UWAGA]

Aplikacja konsument opisane w tej sekcji służy do testowania dostawców próbki MyProv i dostawca.

[!UWAGA]

Do budowania aplikacji konsumenta do testowania MyProv (tego samego dostawcy opisane w Zwiększanie proste dostawca tylko do odczytu), należy dołączyć obsługę zakładek, zgodnie z opisem w "Dodawanie zakładki wsparcia dla konsumenta.

[!UWAGA]

Do budowania aplikacji konsumenta do testowania dostawcy, pominąć obsługę zakładek, opisane w "Dodawanie zakładki obsługuje to the Consumer" i przejdź do "Dodawanie XML wsparcia dla konsumenta.

Pobieranie danych z konsumentem

Aby zmodyfikować aplikację konsoli obsłudze konsumenta OLE DB

  • W MyCons.cpp należy zmienić główny kod wstawiając tekst pogrubiony w następujący sposób:

    // MyCons.cpp : Defines the entry point for the console application.
    //
    #include "stdafx.h"
    #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;
    }
    

Dodawanie obsługi zakładki dla konsumenta

Zakładka jest kolumna, która jednoznacznie identyfikuje wiersze w tabeli.Zazwyczaj jest to kolumna klucza, ale nie zawsze; jest specyficznym dla dostawcy.Ta sekcja pokazuje, jak dodać obsługę zakładek.Aby to zrobić, należy wykonać następujące czynności w klasie rekordu użytkownika:

  • Utwórz wystąpienie zakładek.Są to obiekty tego typu CBookmark.

  • Poproś dostawcę kolumnę zakładki przez ustawienie DBPROP_IRowsetLocate właściwości.

  • Dodaj wpis zakładki do mapy kolumny za pomocą BOOKMARK_ENTRY makro.

Poprzednie kroki umożliwiają obsługę zakładek i obiekt zakładki, z którą chcesz pracować.Poniższy przykład kodu ilustruje zakładki w następujący sposób:

  • Otwórz plik do zapisu.

  • Dane wierszy danych wyjściowych do pliku, wiersz po wierszu.

  • Przeniesienie kursora zestawu wierszy do zakładki przez wywołanie MoveToBookmark.

  • Dane wyjściowe wiersza oznaczonego zakładką, dołączenie jej do końca pliku.

[!UWAGA]

Jeśli używasz tej aplikacji konsumenta do testowania aplikacji dostawcy przykładowy dostawca, pominąć obsługę zakładek, opisane w tej sekcji.

Do utworzenia wystąpienia zakładki

  • Akcesor musi zawierać obiektu typu CBookmark.nSize Parametr określa rozmiar buforu zakładki w bajtach (zazwyczaj 4 dla 32-bitowych platform) i 8 dla 64-bitowych platformach.Dodaj następującą deklarację do kolumny danych członków w klasie rekordu użytkownika:

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

Aby zażądać kolumnę zakładki od dostawcy

  • Dodaj poniższy kod w GetRowsetProperties metoda w klasie rekordu użytkownika:

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

Aby dodać wpis zakładki do mapowania kolumn

  • Dodaj następujący wpis do mapy kolumny w klasie rekordu użytkownika:

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

Aby użyć zakładki w kodzie głównego

  • W pliku MyCons.cpp z utworzonego wcześniej aplikacji konsoli zmienić główny kod brzmienie.Aby użyć zakładki, główny kod potrzebuje do utworzenia wystąpienia obiektu własnej zakładki (myBookmark); to jest zakładka innego niż podano w akcesor (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.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;
    }
    

Aby uzyskać więcej informacji na temat zakładek, zobacz Za pomocą zakładki.Przykłady zakładki są także wyświetlane w Aktualizowania wierszy.

Dodanie obsługi języka XML dla konsumenta

Jak wspomniano w części Uzyskiwanie dostępu do danych XML, istnieją dwa sposoby pobierania danych XML ze źródła danych: za pomocą CStreamRowset lub za pomocą CXMLAccessor.W poniższym przykładzie użyto CStreamRowset, który jest bardziej efektywne, ale wymaga posiadania SQL Server 2000 działającego na komputerze, na którym wykonać tej przykładowej aplikacji.

Aby zmodyfikować klasy polecenia odziedziczone po CStreamRowset

  • We wniosku konsumenta wcześniej utworzony, zmienić swój CCommand deklaracji do określenia CStreamRowset jako zestawu wierszy klasy w następujący sposób:

    class CProducts : public CCommand<CAccessor<CProductsAccessor>, CStreamRowset >
    

Aby zmodyfikować główny kod do pobierania i wysyłania danych XML

  • W pliku MyCons.cpp z utworzonego wcześniej aplikacji konsoli zmienić główny kod brzmienie:

    ///////////////////////////////////////////////////////////////////////
    // 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;
    
       // Add variable declarations for the Read method to handle sequential stream data
       CHAR buffer[1001];  // Pointer to buffer into which data stream is read
       ULONG cbRead;       // Actual number of bytes read from the data stream
    
       hr = rs.OpenAll();
    
       // Open file output.txt for writing in overwrite mode
       ofstream outfile( "C:\\output.txt", ios::out );
    
       if (!outfile)      // Test for invalid file
          return -1;
    
       // The following loop reads 1000 bytes of the data stream at a time 
       // until it reaches the end of the data stream
       for (;;)
       {
          // Read sequential stream data into buffer
          HRESULT hr = rs.m_spStream->Read(buffer, 1000, &cbRead);
          if (FAILED (hr))
             break;
          // Output buffer to file
          buffer[cbRead] = 0;
          outfile << buffer;
          // Test for end of data stream
          if (cbRead < 1000)
             break;
       }
    
       rs.CloseAll();
       CoUninitialize();
    
       return 0;
    }
    

Zobacz też

Koncepcje

Tworzenie konsumenta OLE DB przy użyciu kreatora