Implementação de um consumidor Simple
Os tópicos a seguir mostram como edição os arquivos criados pelo MFC aplicativo assistente e ATL OLE DB consumidor assistente para criar um consumidor simples.Este exemplo tem as seguintes partes:
"Recuperando dados com o consumidor" mostra como implementar o código no consumidor que lê todos os dados, linha por linha, de uma tabela de banco de dados.
"Adicionando suporte indicador para o consumidor" mostra como adicionar suporte ao indicador para o consumidor.
"Adicionando suporte a XML para o consumidor" mostra sistema autônomo modificar o código do consumidor para dar saída aos dados recuperados do conjunto de linhas sistema autônomo dados XML.
Observação: |
---|
Você pode usar o aplicativo de consumidor descrito nesta seção para teste os provedores de amostra MyProv e provedor. |
Observação: |
---|
Para compilação um aplicativo de consumidor para testar MyProv (o mesmo provedor descrito em Aprimorando o provedor de somente leitura Simple), você deve incluir o suporte de indicador sistema autônomo descrito em "Adicionar indicador suporte para o consumidor." |
Observação: |
---|
Para criar um aplicativo de consumidor para testar o provedor, deixe os suportados indicador descrito em "Adicionando Bookmark suporte para o consumidor" e vá para "Adicionando suporte a XML para o consumidor". |
Recuperando dados com o consumidor
Para modificar o aplicativo de console para usar o consumidor OLE DB
No MyCons.cpp, altere o código principal, inserindo texto em negrito da seguinte maneira:
// 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; }
Adicionando suporte a indicador para o consumidor
Um indicador é uma coluna que identifica exclusivamente as linhas da tabela.Geralmente é a coluna de chave, mas nem sempre; é específica ao provedor.Esta seção mostra como adicionar suporte de indicador.Para fazer isso, você precisa fazer o seguinte na classe de registro de usuário:
Criar uma instância de indicadores.Esses são objetos do tipo CBookmark.
Solicitar uma coluna de indicador do provedor, configurando o DBPROP_IRowsetLocatepropriedade .
Adicionar um indicador entrada para o MAP de coluna usando o indicador _ENTRY macro.
As etapas anteriores oferecem suporte indicador e um objeto de indicador com o qual trabalhar.Este exemplo de código demonstra um indicador sistema autônomo segue:
Abra um arquivo para gravação.
Dados de conjunto de linhas de saída para o arquivo linha por linha.
Mover o cursor de conjunto de linhas para o indicador chamando MoveToBookmark.
A linha com indicador, acrescentá-lo ao participante do arquivo de saída.
Observação: |
---|
Se você usar este aplicativo do cliente para testar o aplicativo de provedor de exemplo de provedor, deixe os suportados indicador descrito nesta seção. |
Para criar uma instância do indicador
O acessador precisa conter um objeto do tipo CBookmark.The nSize parâmetro especifica o dimensionar do buffer de indicador em bytes (geralmente 4 para plataformas de 32 bit) e 8 para plataformas de 64 bit. Adicione a declaração a seguir para os membros de dados de coluna na classe de registro de usuário:
////////////////////////////////////////////////////////////////////// // Products.h class CProductsAccessor { public: CBookmark<4> m_bookmark; // Add bookmark declaration LONG m_ProductID; ...
Para solicitar uma coluna de indicador do provedor
Adicione o seguinte código no GetRowsetProperties método na classe de registro de usuário:
// 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); }
Para adicionar uma entrada de marcador para o MAP de coluna
Adicione a seguinte entrada para o MAP de coluna na classe de registro de usuário:
// 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()
Para usar um indicador em seu código principal
No MyCons.cpp arquivo do aplicativo de console anteriormente criado, altere o código principal para sistema autônomo segue.Para utilizar indicadores, o código principal precisa instanciar seu próprio objeto de indicador (myBookmark); Este é um marcador diferente daquele que o o acessador (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; }
Para obter mais informações sobre como marcadores, consulte Usando indicadores.Exemplos de marcadores são também mostrados na Atualizando conjuntos de linhas.
Adicionando suporte a XML para o consumidor
sistema autônomo discutidas Acessando dados XML, há duas maneiras de recuperar dados XML de uma fonte de dados: usando CStreamRowset or using CXMLAccessor.Este exemplo usa CStreamRowset, que é mais eficiente, mas exige que você tenha o SQL servidor 2000 executado no computador em que você executar esse aplicativo de exemplo.
Modificar a classe de comando para herdar de CStreamRowset
No aplicativo de consumidor você anteriormente criou, alterar seu CCommand declaração para especificar CStreamRowset sistema autônomo a classe de conjunto de linhas da seguinte maneira:
class CProducts : public CCommand<CAccessor<CProductsAccessor>, CStreamRowset >
Para modificar o código principal para recuperar e imprimir os dados XML
No arquivo MyCons.cpp do aplicativo de console você anteriormente criado, altere o código principal para ler o seguinte:
/////////////////////////////////////////////////////////////////////// // 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; }