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.
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 dados vinculado.Para obter informações sobre esses membros de dados, consulte Membros de dados do campo Status nos acessadores de Wizard-Generated.
Observaçã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çã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;
Propriedades 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);
}
Classe 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")
Mapa 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()
};
Declaraçã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.