Compartir a través de


Implementar un consumidor sencillo

El Asistente para consumidores OLE DB ATL no está disponible en Visual Studio 2019 ni en versiones posteriores. Puede seguir agregando la funcionalidad manualmente. Para obtener más información, consulte Crear un consumidor sin utilizar un asistente.

Los temas siguientes muestran cómo editar los archivos creados por el Asistente para aplicaciones MFC y Asistente para consumidores OLE DB ATL para crear un consumidor sencillo. En este ejemplo tiene las siguientes partes:

Nota:

Puede usar la aplicación de consumidor que se describe en esta sección para probar los proveedores de ejemplo MyProv y Provider.

Nota:

Para crear una aplicación de consumidor con el fin de probar MyProv (se describe el mismo proveedor en Mejorar un proveedor sencillo de solo lectura), debe incluir compatibilidad con marcadores como se describe en Agregar compatibilidad con marcadores al consumidor.

Recuperación de datos con el consumidor

Modificar la aplicación de consola para usar el consumidor OLE DB

  1. En MyCons.cpp, cambie el código principal mediante la inserción del texto en negrita como sigue:

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

Agregar compatibilidad con marcadores al consumidor

Un marcador es una columna que identifica de forma única las filas de la tabla. Normalmente es la columna de clave, pero no siempre; es específico del proveedor. En esta sección se muestra cómo agregar compatibilidad con marcadores. Para ello, deberá realizar los pasos siguientes en la clase de registro de usuario:

  • Cree una instancia de los marcadores. Estos son los objetos de tipo CBookmark.

  • Solicite una columna de marcador del proveedor estableciendo la propiedad DBPROP_IRowsetLocate.

  • Agregue una entrada de marcador al mapa de columnas mediante la macro BOOKMARK_ENTRY.

Los pasos anteriores proporcionan compatibilidad con marcadores y un objeto de marcador con el que se va a trabajar. Este ejemplo de código muestra un marcador como sigue:

  • Abra un archivo para escritura.

  • Genera los datos del conjunto de filas en el archivo fila por fila.

  • Mueva el cursor del conjunto de filas al marcador mediante una llamada a MoveToBookmark.

  • Genere la fila marcada anexándola al final del archivo.

Nota:

Si usa esta aplicación de consumidor para probar la aplicación de proveedor de ejemplo Provider, omita la compatibilidad con marcadores que se describe en esta sección.

Crear una instancia del marcador

  1. El descriptor de acceso debe contener un objeto de tipo CBookmark. El parámetro nSize especifica el tamaño del búfer del marcador en bytes (normalmente 4 para las plataformas de 32 bits y 8 para las de 64 bits). Agregue la declaración siguiente a los miembros de datos de columna en la clase de registro de usuario:

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

Solicitar una columna de marcador del proveedor

  1. Agregue el código siguiente en el método GetRowsetProperties de clase de registro de usuario:

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

Agregar una entrada de marcador al mapa de columnas

  1. Agregue la siguiente entrada al mapa de columnas en la clase de registro de usuario:

    // 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()
    

Utilizar un marcador en el código principal

  1. En el archivo MyCons.cpp de la aplicación de consola que creó anteriormente, cambie el código principal para que quede como sigue. Para utilizar marcadores, el código principal debe crear una instancia de su propio objeto de marcador (myBookmark); se trata de un marcador diferente de la especificada en el descriptor de acceso (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;
    }
    

Para obtener más información sobre los marcadores, vea Utilizar marcadores. También se muestran ejemplos de marcadores en Actualizar conjuntos de filas.

Consulte también

Crear un consumidor OLE DB mediante un asistente