Partilhar via


Implementando um consumidor simples

O Assistente de Consumidor OLE DB da ATL não está disponível no Visual Studio 2019 e posteriores. Ainda é possível adicionar a funcionalidade manualmente. Saiba mais em Criação de um consumidor sem usar um assistente.

Os tópicos a seguir mostram como editar os arquivos criados pelo Assistente para Aplicativo do MFC e Assistente de Cliente OLE DB da ATL para criar um consumidor simples. Este exemplo tem as seguintes partes:

Observação

O aplicativo do consumidor descrito nesta seção pode ser usado para testar a amostra de provedores MyProv e Provider.

Observação

Para criar um aplicativo de consumidor para teste MyProv (o mesmo provedor descrito em Melhoria do provedor simples somente leitura), você deve incluir suporte a indicadores, conforme descrito em Adição de suporte a indicadores ao consumidor.

Recuperando dados com o consumidor

Para modificar o aplicativo de console para usar o consumidor do OLE DB

  1. Em MyCons.cpp, altere o código principal inserindo o texto em negrito da seguinte maneira:

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

Adicionando suporte a marcadores ao consumidor

Um indicador é uma coluna que identifica exclusivamente linhas na tabela. Geralmente, é a coluna de chave, mas nem sempre; ela é específica do provedor. Esta seção mostra como adicionar suporte a indicadores. Para fazer isso, siga as etapas abaixo na classe de registro do usuário:

  • Crie uma instância de indicadores. Esses são objetos do tipo CBookmark.

  • Solicite uma coluna de indicadores do provedor configurando a propriedade DBPROP_IRowsetLocate.

  • Adicione uma entrada de indicador ao mapa de coluna usando a macro BOOKMARK_ENTRY.

As etapas anteriores dão suporte a indicadores e a 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.

  • Gere dados do conjunto de linhas para o arquivo linha por linha.

  • Mova o cursor do conjunto de linhas para o indicador chamando MoveToBookmark.

  • Gere a linha marcada com indicador, acrescendo-a ao fim do arquivo.

Observação

Se você usar esse aplicativo de consumidor para testar a amostra de aplicativo do provedor Provider, omita o suporte a indicadores descrito nesta seção.

Criação de uma instância do indicador

  1. O acessador precisa manter um objeto do tipo CBookmark. O parâmetro nSize especifica o tamanho do buffer de indicadores em bytes (normalmente 4 para plataformas de 32 bits e 8 para plataformas de 64 bits). Adicione a seguinte declaração aos membros de dados da coluna na classe de registro do usuário:

    //////////////////////////////////////////////////////////////////////
    // Products.h
    class CProductsAccessor
    {
    public:
       CBookmark<4> m_bookmark;   // Add bookmark declaration
       LONG m_ProductID;
       ...
    

Solicitação de uma coluna de indicadores do provedor

  1. Adicione o seguinte código ao método GetRowsetProperties da classe de registro do 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);
    }
    

Adição de uma entrada de indicador ao mapa de coluna

  1. Adicione a seguinte entrada ao mapa de coluna na classe de registro do 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()
    

Uso de um indicador em seu código principal

  1. No arquivo MyCons.cpp do aplicativo de console anteriormente criado, altere o código principal para ler como se segue. Para usar indicadores, o código principal precisa criar uma instância de seu próprio objeto de indicador (myBookmark); esse é um indicador diferente daquele 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.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;
    }
    

Saiba mais sobre os indicadores em Uso de indicadores. Exemplos de indicadores também são mostrados em Atualizando conjuntos de linhas.

Confira também

Criando um consumidor do OLE DB usando um assistente