Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Мастер объекта-получателя ATL OLE DB недоступен в Visual Studio 2019 и более поздних версиях. Эту функцию все еще можно добавить вручную. Дополнительные сведения см. в статье Creating a Consumer Without Using a Wizard (Создание объекта-получателя без помощи мастера).
В следующих разделах показано, как изменить файлы, созданные с помощью мастера приложений MFC и мастера объекта-получателя ATL OLE DB, для создания простого объекта-получателя. Этот пример состоит из следующих частей:
В разделе Извлечение данных с помощью объекта-получателя показано, как реализовать код в объекте-получателе, который считывает все данные построчно с таблицы базы данных.
В разделе Добавление поддержки закладок объекту-получателю показано, как добавить поддержку закладок для объекта-получателя.
Примечание.
Описанное в этом разделе приложение объекта-получателя можно использовать для тестирования примеров поставщиков MyProv и Provider.
Примечание.
Чтобы создать приложение объекта-получателя для тестирования MyProv (тот же поставщик, описанный в разделе Усовершенствование простого поставщика только для чтения), необходимо включить поддержку закладок, как описано в разделе Добавление поддержки закладок для объекта-получателя.
Получение данных с помощью потребителя
Изменение консольного приложения для использования объекта-получателя OLE DB
В
MyCons.cppизмените основной код, вставив полужирный текст следующим образом:// 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; }
Добавление поддержки закладок в потребитель
Закладка — это столбец, который однозначно определяет строки в таблице. Обычно, хотя и не всегда, это ключевой столбец. Он зависит от поставщика. В этом разделе показано, как добавить поддержку закладок. Чтобы сделать это, в классе записей пользователей необходимо сделать следующее:
Создайте экземпляр закладок. Это объекты типа CBookmark.
Запросите столбец закладки от поставщика, задав свойство
DBPROP_IRowsetLocate.Добавьте запись закладки в сопоставление столбцов с помощью макроса BOOKMARK_ENTRY.
Выполнив предыдущие шаги, вы получили поддержку закладок и объект закладки, с которым необходимо работать. Этот пример кода демонстрирует закладку следующим образом:
Откройте файл для записи.
Выведите набор строк в файл построчно.
Переместите курсор набора строк на закладку, вызвав MoveToBookmark.
Выведите добавленную в закладки строку, добавив ее в конец файла.
Примечание.
Если вы используете это приложение объекта-получателя для тестирования примера приложения поставщика Provider, опустите поддержку закладок, описанную в этом разделе.
Создание экземпляра закладки
Метод доступа должен содержать объект типа CBookmark. Параметр nSize задает размер буфера закладки в байтах (обычно, 4 для 32-разрядных и 8 для 64-разрядных платформ). Добавьте следующее объявление к элементам данных столбца в классе записей пользователей:
////////////////////////////////////////////////////////////////////// // Products.h class CProductsAccessor { public: CBookmark<4> m_bookmark; // Add bookmark declaration LONG m_ProductID; ...
Запрос столбца закладки от поставщика
Добавьте следующий код в метод
GetRowsetPropertiesв классе записей пользователей:// 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); }
Добавление записи закладки в сопоставление столбцов
Добавьте следующую запись в сопоставление столбцов в классе записей пользователей:
// 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()
Использование закладки в основном коде
В файле
MyCons.cppиз ранее созданного консольного приложения измените основной код для чтения следующим образом. Для использования закладок основному коду необходимо создать собственный объект закладки (myBookmark). Это закладка, отличающаяся от закладки в методе доступа (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; }
Дополнительные сведения о закладках см. в этой статье. Примеры закладок также показаны в статье Updating Rowsets (Обновление наборов строк).