Compartilhar via


Implementar um consumidor Simple

Os tópicos a seguir mostram como editar os arquivos criados com o Assistente de aplicativo do MFC e ATL OLE DB consumidor Wizard para criar um consumidor simple.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 de indicador para o consumidor" mostra como adicionar suporte de indicador para o consumidor.

  • "Adicionando suporte a XML para o consumidor" mostra como modificar o código do consumidor para os dados do conjunto de registros recuperados como dados XML de saída.

ObservaçãoObservação

Você pode usar o aplicativo de consumidor descrito nesta seção para testar os provedores de exemplo MyProv e provedor.

ObservaçãoObservação

Para criar um aplicativo de consumidor para testar MyProv (o mesmo provedor descrito em aprimorando o provedor de somente leitura simples), você deve incluir o suporte de indicador conforme descrito em "Adicionando suporte de indicador para o consumidor".

ObservaçãoObservação

Para criar um aplicativo de consumidor para testar o provedor, deixar o suporte de indicador descrito em "Adicionando indicador 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 do 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 de indicador para o consumidor

Um indicador é uma coluna que identifica exclusivamente linhas na tabela.Geralmente é a coluna da chave, mas nem sempre; é específico do 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:

  • Instancie os indicadores.Esses são objetos do tipo CBookmark.

  • Solicitar uma coluna de indicador do provedor, definindo a DBPROP_IRowsetLocate propriedade.

  • Adicionar uma entrada de indicador no mapa de coluna usando o BOOKMARK_ENTRY macro.

As etapas anteriores oferecem suporte de indicador e um objeto de indicador com o qual trabalhar.Este exemplo de código demonstra um indicador da seguinte maneira:

  • Abra um arquivo para gravação.

  • Saída de dados de conjunto de linhas no arquivo linha por linha.

  • Move o cursor de conjunto de linhas para o indicador chamando MoveToBookmark.

  • Linha favorito, acrescentando o final do arquivo de saída.

ObservaçãoObservação

Se você usar esse aplicativo de consumidor para testar o aplicativo de provedor do provedor exemplo, deixe o suporte de indicador descrito nesta seção.

Para instanciar o indicador

  • O acessador precisa conter um objeto do tipo CBookmark.O nSize parâmetro especifica o tamanho do buffer indicador em bytes (geralmente 4 para plataformas de 32 bits) e 8 para plataformas de 64 bits.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 na 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 indicador no mapa de coluna

  • Adicione a seguinte entrada para o mapa 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 no seu código principal

  • No arquivo MyCons.cpp do aplicativo de console criado anteriormente, altere o código principal para ler o seguinte.Para utilizar indicadores, o código principal precisa instanciar seu próprio objeto do indicador (myBookmark); Este é um indicador diferente no 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 marcadores, consulte Usando marcadores.Exemplos de indicadores também são mostrados na Atualizando conjuntos de linhas.

Adicionando suporte a XML para o consumidor

Conforme discutido em Acessando dados XML, existem duas maneiras de recuperar dados XML de uma fonte de dados: usando CStreamRowset ou CXMLAccessor.Este exemplo usa CStreamRowset, que é mais eficiente, mas você precisa ter o SQL Server 2000 em execução no computador em que você executar esse aplicativo de exemplo.

Modificar a classe de comando para herdar de CStreamRowset

  • No aplicativo de consumidor criado anteriormente, alterar seu CCommand declaração especificar CStreamRowset como o conjunto de registros de classe da seguinte maneira:

    class CProducts : public CCommand<CAccessor<CProductsAccessor>, CStreamRowset >
    

Para modificar o código principal para recuperar e exibir dados XML

  • No arquivo MyCons.cpp do aplicativo de console criado anteriormente, 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;
    }
    

Consulte também

Conceitos

Criando um consumidor de BD OLE usando um assistente