Share via


Clases generadas por el Asistente para consumidores

Actualización: noviembre 2007

Si se utiliza el Asistente para consumidores OLE DB ATL para generar un consumidor, se puede elegir entre el uso de plantillas OLE DB o atributos OLE DB. En ambos casos, el asistente genera una clase de comando y una clase de registro de usuario. La clase de comando contiene código para abrir el origen de datos y el conjunto de filas especificados en el asistente. La clase de registro de usuario contiene un mapa de columnas de la tabla de base de datos seleccionada. Sin embargo, el código generado es distinto en cada caso:

  • Si selecciona un consumidor con plantilla, el asistente genera una clase de comando y una clase de registro de usuario. La clase de comando tendrá el nombre que escriba en el cuadro Clase del asistente (en este caso, CProducts) y la clase de registro de usuario tendrá un nombre con el formato "nombreDeClaseAccessor" (en este caso, CProductsAccessor). Ambas clases se colocan en el archivo de encabezado del consumidor.

  • Si selecciona un consumidor con atributos, la clase de registro de usuario tendrá un nombre con el formato "_nombreDeClaseAccessor" y será insertada. Sólo podrá ver la clase de comando en el editor de texto; la clase de registro de usuario sólo se podrá ver como código insertado. Para obtener más información sobre cómo ver el código insertado, vea Depurar código insertado.

En los ejemplos siguientes se utiliza una clase de comando creada en la tabla Products de la base de datos Northwind para mostrar el código de consumidor generado por el asistente para la clase de comando y la clase de registro de usuario.

Clases de registro de usuario con plantillas

Si se crea un consumidor OLE DB mediante las plantillas OLE DB (en lugar de los atributos OLE DB), el asistente genera código como se describe en esta sección.

Miembros de datos de columna

La primera parte de la clase de registro de usuario incluye las declaraciones de miembro de datos y los miembros de datos de estado y longitud para cada columna enlazada a datos. Para obtener información sobre estos miembros de datos, vea Miembros de datos sobre el estado de un campo en los descriptores de acceso generados por el asistente.

Nota:

Si se modifica la clase de registro de usuario o se crea un consumidor personalizado, las variables de datos deben figurar antes que las de estado y longitud.

Nota:

El Asistente para consumidores OLE DB ATL usa el tipo DB_NUMERIC para enlazar tipos de datos numéricos. Anteriormente usaba DBTYPE_VARNUMERIC (cuyo formato se describe en el tipo DB_VARNUMERIC; vea Oledb.h). Si no utiliza el asistente para crear consumidores, se recomienda usar DB_NUMERIC.

// Products.H : Declaration of the CProducts class

class CProductsAccessor
{
public:
   // Column data members:
   LONG m_ProductID;
   TCHAR m_ProductName[41];
   LONG m_SupplierID;
   LONG m_CategoryID;
   TCHAR m_QuantityPerUnit[21];
   CURRENCY m_UnitPrice;
   SHORT m_UnitsInStock;
   SHORT m_UnitsOnOrder;
   SHORT m_ReorderLevel;
   VARIANT_BOOL m_Discontinued;

   // Column status data members:
   DBSTATUS m_dwProductIDStatus;
   DBSTATUS m_dwProductNameStatus;
   DBSTATUS m_dwSupplierIDStatus;
   DBSTATUS m_dwCategoryIDStatus;
   DBSTATUS m_dwQuantityPerUnitStatus;
   DBSTATUS m_dwUnitPriceStatus;
   DBSTATUS m_dwUnitsInStockStatus;
   DBSTATUS m_dwUnitsOnOrderStatus;
   DBSTATUS m_dwReorderLevelStatus;
   DBSTATUS m_dwDiscontinuedStatus;

   // Column length data members:
   DBLENGTH m_dwProductIDLength;
   DBLENGTH m_dwProductNameLength;
   DBLENGTH m_dwSupplierIDLength;
   DBLENGTH m_dwCategoryIDLength;
   DBLENGTH m_dwQuantityPerUnitLength;
   DBLENGTH m_dwUnitPriceLength;
   DBLENGTH m_dwUnitsInStockLength;
   DBLENGTH m_dwUnitsOnOrderLength;
   DBLENGTH m_dwReorderLevelLength;
   DBLENGTH m_dwDiscontinuedLength;

Propiedades del conjunto de filas

A continuación, el asistente establece las propiedades del conjunto de filas. Si se ha seleccionado Cambiar, Insertar, o Eliminar en el Asistente para consumidores OLE DB ATL, las propiedades adecuadas se establecen aquí, (siempre se establece DBPROP_IRowsetChange y, a continuación, una o varias de entre DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT y DBPROPVAL_UP_DELETE).

   void GetRowsetProperties(CDBPropSet* pPropSet)
   {
      pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
      pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
      pPropSet->AddProperty(DBPROP_IRowsetChange, true, DBPROPOPTIONS_OPTIONAL);
      pPropSet->AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
   }

Clase de comando o tabla

Si se especifica una clase de comando, el asistente declara la clase de comando; para código con plantillas, el comando es similar a éste:

   DEFINE_COMMAND_EX(CProductsAccessor, L" \
   SELECT \
      ProductID, \
      ProductName, \
      SupplierID, \
      CategoryID, \
      QuantityPerUnit, \
      UnitPrice, \
      UnitsInStock, \
      UnitsOnOrder, \
      ReorderLevel, \
      Discontinued \
      FROM dbo.Products")

Mapa de columnas

Después el asistente genera los enlaces de columna o mapa de columnas. Para corregir varios problemas con algunos proveedores, puede que en el código siguiente se enlacen columnas en un orden diferente del que indica el proveedor.

   BEGIN_COLUMN_MAP(CProductsAccessor)
      COLUMN_ENTRY_LENGTH_STATUS(1, m_ProductID, m_dwProductIDLength, m_dwProductIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(2, m_ProductName, m_dwProductNameLength, m_dwProductNameStatus)
      COLUMN_ENTRY_LENGTH_STATUS(3, m_SupplierID, m_dwSupplierIDLength, m_dwSupplierIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(4, m_CategoryID, m_dwCategoryIDLength, m_dwCategoryIDStatus)
      COLUMN_ENTRY_LENGTH_STATUS(5, m_QuantityPerUnit, m_dwQuantityPerUnitLength, m_dwQuantityPerUnitStatus)
      _COLUMN_ENTRY_CODE(6, DBTYPE_CY, _SIZE_TYPE(m_UnitPrice), 0, 0, offsetbuf(m_UnitPrice), offsetbuf(m_dwUnitPriceLength), offsetbuf(m_dwUnitPriceStatus))
      COLUMN_ENTRY_LENGTH_STATUS(7, m_UnitsInStock, m_dwUnitsInStockLength, m_dwUnitsInStockStatus)
      COLUMN_ENTRY_LENGTH_STATUS(8, m_UnitsOnOrder, m_dwUnitsOnOrderLength, m_dwUnitsOnOrderStatus)
      COLUMN_ENTRY_LENGTH_STATUS(9, m_ReorderLevel, m_dwReorderLevelLength, m_dwReorderLevelStatus)
      _COLUMN_ENTRY_CODE(10, DBTYPE_BOOL, _SIZE_TYPE(m_Discontinued), 0, 0, offsetbuf(m_Discontinued), offsetbuf(m_dwDiscontinuedLength), offsetbuf(m_dwDiscontinuedStatus))
   END_COLUMN_MAP()
};

Declaración de clase

Por último, el asistente genera una declaración de clase de comando como la siguiente:

class CProducts : public CCommand<CAccessor<CProductsAccessor> >

Clases de registro de usuario con atributos

Si crea un consumidor OLE DB mediante los atributos de base de datos (db_command o db_table), los atributos crean una clase de registro de usuario con un nombre que sigue el modelo "_nombreDeClaseAccessor". Por ejemplo, si se da el nombre COrders a la clase de comando, la clase de registro de usuario será _COrdersAccessor. Si bien la clase de registro de usuario aparece en la Vista de clases, al hacer doble clic en ella se abre la clase de comando o tabla en el archivo de encabezado. En estos casos sólo se puede ver la declaración de la clase de registro de usuario viendo el código con atributos.

Pueden presentarse complicaciones si se agregan o reemplazan métodos en consumidores con atributos. Por ejemplo, puede agregar un constructor _COrdersAccessor a la declaración COrders, pero observe que en realidad se agrega un constructor a la clase COrdersAccessor insertada. El constructor puede inicializar las columnas o los parámetros, pero no se puede crear un constructor de copias de esta manera, porque el constructor no puede crear directamente una instancia del objeto COrdersAccessor. Si es necesario incluir un constructor (u otro método) directamente en la clase COrders, se recomienda definir una nueva clase que se derive de COrders y agregar a ella los métodos necesarios.

En el ejemplo siguiente, el asistente genera una declaración para la clase COrders, pero la clase de registro de usuario COrdersAccessor no aparece, porque los atributos la insertan.

#define _ATL_ATTRIBUTES
#include <atlbase.h>
#include <atldbcli.h>
[
   db_source(L"your connection string"),
   db_command(L"Select ShipName from Orders;")
]
class COrders
{
public:

   // COrders()            // incorrect constructor name
   _COrdersAccessor()      // correct constructor name
   {
   }
      [db_column(1) ] TCHAR m_ShipName[41];
   };

La declaración de clase de comando insertada presenta el siguiente aspecto:

class CProducts : public CCommand<CAccessor<_CProductsAccessor> >

La mayor parte del código insertado es igual o similar a la versión con plantilla. Las diferencias principales están en los métodos insertados, que se describen en Métodos generados por el Asistente para consumidores.

Para obtener más información sobre cómo ver el código insertado, vea Depurar código insertado.

Vea también

Conceptos

Crear un consumidor OLE DB mediante un asistente