Compartilhar via


Consumidor Assistente-gerado Classes

Quando você usar a ATL OLE DB consumidor Assistente 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 de usuário.A classe de comando contém código para abrir a fonte de dados e o conjunto de linhas especificado no assistente.A classe de registro de usuário contém um mapa de coluna para a tabela de banco de dados selecionado.No entanto, o código gerado é diferente em cada caso:

  • Se você selecionar um consumidor do modelo, o assistente gera uma classe de comando e uma classe de registro de usuário.A classe de comando terá o nome que você digitar na caixa Assistente de classe (por exemplo, CProducts), e a classe de registro de 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 de usuário terá um nome do formulário "_ClassNameacessador" e será injetado.Ou seja, você poderá exibir somente 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 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 gerado pelo Assistente de consumidor para a classe de comando e a classe de registro de usuário.

Modelado Classes de registro de usuário

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

6e230s5w.collapse_all(pt-br,VS.110).gifMembros 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 dados vinculado.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 para vincular a tipos de dados numéricos.Ele usado anteriormente DBTYPE_VARNUMERIC (o formato é descrito pela DB_VARNUMERIC tipo; 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;

6e230s5w.collapse_all(pt-br,VS.110).gifPropriedades do conjunto de linhas

Em seguida, o assistente define as propriedades do conjunto de linhas.Se você selecionou Alterar, Inserir, ou Excluir no ATL OLE DB consumidor assistente, as propriedades adequadas são definidas aqui (DBPROP_IRowsetChange é sempre definido, em seguida, um ou mais dos DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT e 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);
   }

6e230s5w.collapse_all(pt-br,VS.110).gifClasse de tabela ou 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")

6e230s5w.collapse_all(pt-br,VS.110).gifMapa de coluna

O assistente gera o mapa de coluna ou ligações de coluna.Para corrigir vários problemas com alguns provedores, o código a seguir pode vincular 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()
};

6e230s5w.collapse_all(pt-br,VS.110).gifDeclaração de classe

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

class CProducts : public CCommand<CAccessor<CProductsAccessor> >

Injetado atributo Classes de registro de usuário

Se você criar um consumidor de OLE DB usando os atributos do banco de dados (db_command ou db_table), os atributos injetar uma classe de registro de usuário com um nome do formulário "_ClassNameassessor." Por exemplo, se você nomeou sua classe de comando COrders, a classe de registro de usuário será _COrdersAccessor.Embora a classe de registro de usuário no modo de exibição de classe, duas vezes sobre ele navega para a classe de comando ou 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 possíveis 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 observe que na realidade isso adiciona um construtor para o injetado COrdersAccessor classe.Esse construtor pode inicializar colunas/parâmetros, mas não é possível criar um construtor de cópia dessa maneira, porque ele não é possível instanciar diretamente o COrdersAccessor objeto.Se você precisar de um construtor (ou outro método) diretamente na COrders classe, é recomendável que você defina uma nova classe derivando de COrders e adicione os métodos necessários para 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 inserem-lo.

#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 da classe comando injetado esta aparência:

class CProducts : public CCommand<CAccessor<_CProductsAccessor> >

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

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

Consulte também

Conceitos

Criando um consumidor de BD OLE usando um assistente