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.