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