Compartilhar via


Classes geradas pelo Assistente do consumidor

Quando você usa o ATL OLE DB consumidor Wizard para gerar um consumidor, você tem a opção de usar atributos de modelos OLE DB ou OLE DB. Em ambos os casos, o assistente gera uma classe de comando e uma classe de registro do usuário. A classe de comando contém código para abrir a fonte de dados e um conjunto de linhas que você especificou no assistente. A classe de registro de usuário contém um mapa de coluna para a tabela de banco de dados que você selecionou. No entanto, o código gerado é diferente em cada caso:

  • Se você selecionar um consumidor de modelo, o assistente gera uma classe de comando e uma classe de registro do usuário. A classe de comando terá o nome digitado na caixa Assistente de classe (por exemplo, CProducts), e a classe de registro do usuário terá um nome do formulário "ClassNameacessador" (por exemplo, CProductsAccessor). Ambas as classes são colocadas no arquivo de cabeçalho do consumidor.

  • Se você selecionar um consumidor atribuído, a classe de registro do usuário terá um nome do formulário "_ClassNameacessador" e será injetado. Ou seja, você será capaz de exibir apenas a classe de comando no editor de texto; Você só pode exibir a classe de registro de usuário como o código injetado. Para obter informações sobre como exibir o código injetado, consulte Depurando o código injetado.

Os exemplos seguintes usam uma classe de comando criado na tabela Produtos de banco de dados Northwind para demonstrar o código do consumidor gerado pelo Assistente para a classe de comando e a classe de registro do usuário.

Classes de registro de usuário Templated

Se você criar um consumidor de OLE DB, usando os modelos OLE DB (em vez dos atributos de OLE DB), o assistente gera código, conforme descrito nesta seção.

Membros de dados de coluna

A primeira parte da classe de registro de usuário inclui as declarações de membro de dados e os membros de dados de status e o comprimento de cada coluna de data-bound. Para obter informações sobre esses membros de dados, consulte Membros de dados do campo Status nos acessadores de Wizard-Generated.

ObservaçãoObservação

Se você modificar a classe de registro de usuário ou escreve seu próprio consumidor, as variáveis de dados devem vir antes das variáveis de status e de comprimento.

ObservaçãoObservação

O ATL OLE DB consumidor assistente usa o DB_NUMERIC tipo de ligação de tipos de dados numéricos. Ele foi usado anteriormente DBTYPE_VARNUMERIC (cujo formato é descrito pela DB_VARNUMERIC digite; Consulte OLEDB. h). Se você não usar o Assistente para criar os consumidores, é recomendável que você use 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;

Propriedades do conjunto de linhas

Em seguida, o assistente define as propriedades do conjunto de linhas. Se você selecionou alteração, Inserir, ou Excluir na ATL OLE DB consumidor Wizard, as propriedades adequadas são definidas aqui (DBPROP_IRowsetChange é sempre definido, em seguida, um ou mais DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT e/ou DBPROPVAL_UP_DELETE, respectivamente).

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

Classe de tabela ou de comando

Se você especificar uma classe de comando, o assistente declara a classe de comando; código de modelo, o comando tem esta aparência:

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

Mapa de coluna

Em seguida, o assistente gera as ligações de coluna ou o mapa de coluna. Para corrigir vários problemas com alguns provedores, o código a seguir pode ligar colunas em uma ordem diferente daquela relatada pelo provedor.

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

Declaração de classe

Finalmente, o assistente gera uma declaração de classe de comando como, por exemplo, o seguinte:

class CProducts : public CCommand<CAccessor<CProductsAccessor> >

Classes de registro de usuário injetado de atributo

Se você criar um consumidor de OLE DB, usando os atributos de banco de dados (db_command ou db_table), os atributos de injetar uma classe de registro de usuário com um nome do formulário "_ClassNameacessador." Por exemplo, se você nomeou sua classe de comando COrders, a classe de registro do usuário será _COrdersAccessor. Embora a classe de registro do usuário aparece no modo de exibição de classe, duas vezes sobre ele navega para a classe de comando ou a tabela no arquivo de cabeçalho em vez disso. Nesses casos, você só pode exibir a declaração real da classe de registro de usuário, exibindo o código injetado de atributo.

Pode haver complicações potenciais se você adicionar ou substituir os métodos de consumidores atribuídos. Por exemplo, você poderia adicionar um _COrdersAccessor construtor para o COrders declaração, mas lembre-se que, na verdade isso adiciona um construtor para o injetado COrdersAccessor classe. Como um construtor pode inicializar os colunas/parâmetros, mas é possível criar um construtor de cópia dessa maneira, porque ele não é possível instanciar diretamente a COrdersAccessor objeto. Se você precisar de um construtor (ou outro método) diretamente no COrders classe, é recomendável que você defina uma nova classe derivando de COrders e adicione os métodos necessários lá.

No exemplo a seguir, o assistente gera uma declaração da classe COrders, mas a classe de registro de usuário COrdersAccessor não aparecer, porque os atributos de injetar o proprietário.

#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];
   };

A declaração de classe de comando injetado tem esta aparência:

class CProducts : public CCommand<CAccessor<_CProductsAccessor> >

A maioria do código injetado é igual ou semelhante para a versão de modelo. As principais diferenças são nos métodos injetados, que são descritos em Métodos de Consumer Wizard-Generated.

Para obter informações sobre como exibir o código injetado, consulte Depurando o código injetado.

Consulte também

Conceitos

A criação de um consumidor de BD OLE usando um assistente