Compartilhar via


Classes geradas pelo Assistente do consumidor

Quando você usa o 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 do usuário.A classe de comando contém código para em em aberto a fonte de dados e o conjunto de linhas especificado no assistente.A classe de registro de usuário contém um MAP de coluna da tabela de banco de dados selecionado.No entanto, o código gerado é diferente em cada caso:

  • Se você selecionar um modelo consumidor, 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 do assistente (por exemplo, classeCProducts), 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á o nome do formulário "_ClassNameAcessador"e serão injetados.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 sistema autônomo código injetado.Para obter informações sobre como exibir o código injetado, consulte Depurando código introduzido.

Os exemplos a seguir usam um comando classe criada na tabela Produtos do 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 com modelo

Se você criar um consumidor OLEDB uso de modelos OLE DB (em vez de atributos do 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 com dados vinculados.Para obter informações sobre esses membros de dados, consulte Campo status dados Members in acessadores gerado pelo Assistente.

Observação:

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

Observação:

O ATL OLE DB consumidor assistente usa o DB_NUMERIC tipo ao BIND tipos de dados numéricos.Ele usado anteriormente DBTYPE_VARNUMERIC (o formato é descrito pelo 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;

Propriedades do conjunto de linhas

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

Comando ou classe de tabela

Se você especificar uma classe de comando, o Assistente declara a classe de comando; para código de modelo, o comando fica assim:

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

MAP de coluna

O assistente gera, em seguida, a coluna ligações ou no MAP de coluna.Para corrigir vários problemas com alguns provedores, o código a seguir pode BIND colunas em uma ordem diferente daquela que 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, sistema autônomo o seguinte:

class CProducts : public CCommand<CAccessor<CProductsAccessor> >

Classes de registro de usuário injetado atributo

Se você criar um consumidor OLE DB usando os atributos de banco de dados (db_command or 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 seu comando classe COrders, a classe de registro do 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 potenciais se você adicionar ou substituir os métodos de consumidores atribuídos.Por exemplo, você pode adicionar um _COrdersAccessor construtor para o COrders declaração, mas observe que na verdade isso adiciona um construtor a injetado COrdersAccessor classe. Como um 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 Outros método) diretamente sobre o COrders classe, é recomendável que você defina uma nova classe que deriva de COrders e adicione os métodos necessários lá.

No exemplo a seguir, o assistente gera uma declaração para a classe COrders, mas a classe de registro do usuário COrdersAccessor não é exibido, pois os atributos de injetá-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 injetado comando tem esta aparência:

class CProducts : public CCommand<CAccessor<_CProductsAccessor> >

A maior parte do código injetado é o mesmo sistema autônomo ou semelhantes para a versão de modelo.As principais diferenças são no modo de métodos injetados, que são descritos em Consumidor métodos gerados pelo Assistente.

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

Consulte também

Conceitos

Criação de um consumidor de BD OLE DB usando um assistente