Implementace jednoduchého příjemce
Průvodce příjemcem ATL OLE DB není v sadě Visual Studio 2019 a novější k dispozici. Funkci můžete přidat ručně. Další informace naleznete v tématu Vytvoření příjemce bez použití průvodce.
Následující témata ukazují, jak upravit soubory vytvořené Průvodce aplikací MFC a Průvodce příjemcem KNIHOVNY ATL OLE DB vytvořit jednoduchého příjemce. Tento příklad má následující části:
Načítání dat pomocí příjemce ukazuje, jak implementovat kód v příjemci, který čte všechna data, řádek po řádku z databázové tabulky.
Přidání podpory záložek pro příjemce ukazuje, jak přidat podporu záložek příjemci.
Poznámka:
K otestování MyProv
zprostředkovatelů a Provider
ukázkových zprostředkovatelů můžete použít aplikaci příjemce popsanou v této části.
Poznámka:
Chcete-li vytvořit aplikaci příjemce pro testování MyProv
(stejný zprostředkovatel popsaný v rozšíření jednoduchého zprostředkovatele jen pro čtení), musíte zahrnout podporu záložek, jak je popsáno v části Přidání podpory záložek příjemci.
Načítání dat pomocí příjemce
Úprava konzolové aplikace tak, aby používala příjemce OLE DB
V
MyCons.cpp
, změnit hlavní kód vložením tučného textu následujícím způsobem:// 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; }
Přidání podpory záložek pro příjemce
Záložka je sloupec, který jednoznačně identifikuje řádky v tabulce. Obvykle se jedná o klíčový sloupec, ale ne vždy; je specifický pro poskytovatele. V této části se dozvíte, jak přidat podporu záložek. K tomu je potřeba provést následující kroky ve třídě záznamů uživatele:
Vytvořte instanci záložek. Jedná se o objekty typu CBookmark.
Požádejte o sloupec záložky od zprostředkovatele nastavením
DBPROP_IRowsetLocate
vlastnosti.Přidejte položku záložky do mapy sloupců pomocí makra BOOKMARK_ENTRY .
Předchozí kroky poskytují podporu záložek a objekt záložky, se kterým chcete pracovat. Tento příklad kódu ukazuje záložku následujícím způsobem:
Otevřete soubor pro zápis.
Výstupní data sady řádků do řádku souboru po řádku
Přesunutí kurzoru sady řádků na záložku voláním MoveToBookmark.
Vypíše řádek s záložkou a připojí ho na konec souboru.
Poznámka:
Pokud tuto aplikaci příjemce použijete k otestování Provider
ukázkové aplikace zprostředkovatele, ponechte podporu záložek popsanou v této části.
Vytvoření instance záložky
Přístupový objekt musí obsahovat objekt typu CBookmark. Parametr nSize určuje velikost vyrovnávací paměti záložky v bajtech (obvykle 4 pro 32bitové platformy a 8 pro 64bitové platformy). Do datových členů sloupce ve třídě záznamu uživatele přidejte následující deklaraci:
////////////////////////////////////////////////////////////////////// // Products.h class CProductsAccessor { public: CBookmark<4> m_bookmark; // Add bookmark declaration LONG m_ProductID; ...
Žádost o sloupec záložky od poskytovatele
Do metody ve třídě záznamu
GetRowsetProperties
uživatele přidejte následující kód:// 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); }
Přidání položky záložky do mapy sloupců
Do mapy sloupců ve třídě záznamu uživatele přidejte následující položku:
// 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()
Použití záložky v hlavním kódu
MyCons.cpp
V souboru z konzolové aplikace, kterou jste vytvořili dříve, změňte hlavní kód tak, aby se četl následujícím způsobem. Aby bylo možné používat záložky, hlavní kód musí vytvořit instanci vlastního objektu záložky (myBookmark
); jedná se o jinou záložku než záložku v přístupovém objektu (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; }
Další informace o záložkách naleznete v tématu Použití záložek. Příklady záložek se také zobrazují v části Aktualizace sad řádků.