Udostępnij za pośrednictwem


Wykonania prostego konsumenta

Jak edytować pliki utworzone przez Kreatora aplikacji MFC i ATL OLE DB konsumenta kreatora, aby utworzyć prosty konsumenta można znaleźć w następujących tematach.W tym przykładzie zawiera następujące segmenty:

  • "Pobieranie danych z konsumentem" przedstawiono sposób wykonania kodu w konsumenta, który czyta dane, wiersz po wierszu z tabeli bazy danych.

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

  • "Dodawanie obsługi języka XML do konsumenta" pokazuje, jak zmodyfikować kod konsumenta do wyprowadzania danych pobranych wierszy w danych XML.

[!UWAGA]

Aplikacja konsumenta, opisane w tej sekcji można użyć do testowania dostawców próbki MyProv i dostawcy.

[!UWAGA]

Tworzenie aplikacji konsumenta do testowania MyProv (tego samego dostawcy, opisane w zwiększenie proste dostawcy tylko do odczytu), musi zawierać wsparcia zakładki, zgodnie z opisem w "Dodawanie zakładki wsparcie dla konsumenta."

[!UWAGA]

Tworzenie aplikacji konsumenta do testowania dostawcy, opuszczenie wsparcia zakładki opisanych w "Dodawanie zakładki obsługuje do konsumenta" i przejdź do "Dodawanie obsługa języka XML do konsumenta."

Pobieranie danych z konsumentem

Aby zmodyfikować aplikację konsoli 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 do konsumenta

Zakładka jest kolumny, która jednoznacznie identyfikuje wierszy w tabeli.Zazwyczaj jest kolumna klucza, ale nie zawsze; jest specyficzny dla dostawcy.W tej sekcji przedstawiono sposób dodać obsługę zakładki.W tym celu należy wykonać następujące czynności w klasie rekordu użytkownika:

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

  • Żądania kolumnę zakładki od usługodawcy przez ustawienie DBPROP_IRowsetLocate właściwości.

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

Poprzednie kroki udzielić wsparcia zakładki i obiekt zakładki, z którą chcesz pracować.Ten przykładowy kod ilustruje zakładki w następujący sposób:

  • Otwórz plik do zapisu.

  • Dane wyjściowe wierszy pliku wiersz po wierszu.

  • Przeniesienie kursora zestawu wierszy do zakładki, wywołując MoveToBookmark.

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

[!UWAGA]

Testowania aplikacji dostawcy dostawca próbki za pomocą tej aplikacji konsumentów należy pozostawić z obsługi zakładki, 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 na platformach 32-bitowe) i 8 dla 64-bitowych platformach.Członkom kolumny danych w klasie rekordu użytkownika należy dodać następującą deklarację:

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

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

  • Dodaj następujący 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 mapy kolumny

  • 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łówne

  • W pliku MyCons.cpp z utworzonego wcześniej aplikacji konsoli zmienić kod głównego brzmienie.Aby użyć zakładki, główny kod musi wystąpienia obiektu własne zakładki (myBookmark); to jest zakładka różnych od 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 do konsumenta

Jak już wspomniano w Dostępu do danych XML, istnieją dwa sposoby, aby pobrać dane XML ze źródła danych: za pomocą CStreamRowset lub za pomocą CXMLAccessor.W tym przykładzie CStreamRowset, który jest bardziej efektywne, ale wymaga może być uruchomiony na komputerze, na którym będzie wykonanie tej aplikacji przykładowej programu SQL Server 2000.

Aby zmodyfikować klasy polecenia dziedziczenie z CStreamRowset

  • W aplikacji konsumenta utworzone wcześniej, należy zmienić na CCommand zgłoszenia, aby określić 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 otrzymuje 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 DB OLE, za pomocą Kreatora