Classes geradas pelo Assistente do Consumidor
Quando você usa o assistente do consumidor de ATL OLE DB para gerar um consumidor, você tem a opção de usar modelos OLE DB ou atributos OLE DB. Em ambos os casos, o assistente gerenciar uma classe de comando e uma classe de registro do usuário. A classe do comando contém o código para abrir a fonte de dados e o 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 base de dados que você selecionou. Porém, o código gerado é diferente em cada caso:
Se você selecionar um consumidor templated, o assistente gerenciar uma classe de comando e uma classe de registro do usuário. A classe do comando terá o nome que você insere na caixa da classe no assistente (por exemplo, CProducts), e a classe de registro do usuário terá um nome no formato “ClassNameAccessor” (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 no formato "_ClassNameAccessor" e será injetada. Isto é, você poderá exibir somente a classe do comando no editor de texto; você só pode exibir a classe de registro do usuário como código SQL injetado. Para obter informações sobre o código SQL injetado exibição, consulte Código SQL injetado depuração.
Os exemplos a seguir usam uma classe de comando criada na tabela de produtos da base de dados Northwind para demonstrar o código script MDX do consumidor da classe da classe de comando e registro do usuário.
Classes de registro do usuário de Templated
Se você criar um consumidor OLE DB que usa os modelos OLE DB (em vez dos atributos de OLE DB), o assistente gerencia o código como descrito nesta seção.
Membros de dados da coluna
A primeira parte da classe de registro de usuário inclui as declarações de membro de dados e os membros de dados do status e o comprimento de cada coluna associada a dados. Para obter mais informações sobre esses membros de dados, consulte Membros de dados de status do campo em acessadores script gerados.
Dica
Se você alterar a classe de registro do usuário ou escrever seu próprio consumidor, variáveis de dados devem vir antes de variáveis de status e comprimento.
Dica
O assistente do consumidor de ATL OLE DB usa o tipo de DB_NUMERIC para associar tipos de dados numéricos.Usou anteriormente DBTYPE_VARNUMERIC (o formato de que é descrito pelo tipo de DB_VARNUMERIC ; consulte Oledb.h).Se você não usar o assistente para criar consumidores, é recomendável usar 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 de conjunto de linhas
Em seguida, o assistente define propriedades de conjunto de linhas. Se você selecionou Alterar, Inserir, ou Excluir no assistente do consumidor de ATL OLE DB, as propriedades adequadas são definidas aqui (DBPROP_IRowsetChange sempre é definido, em um ou mais de 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 command ou de tabela
Se você especificar uma classe de comando, o assistente declara a classe do comando; para o código templated, o comando tem a seguinte 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 gerencia as associações de coluna ou o mapa da coluna. Para corrigir vários problemas com alguns provedores, o seguinte código pode associar colunas em uma ordem diferente de aquela informada 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 gerenciar uma declaração de classe do comando como o seguinte:
class CProducts : public CCommand<CAccessor<CProductsAccessor> >
Classes de registro atributo injetadas do usuário
Se você criar um consumidor OLE DB que usa os atributos da base de dados (db_command ou db_table), os atributos injetam uma classe de registro de usuário com um nome no formato "_ClassNameAccessor." Por exemplo, se você denominada sua classe COrdersdo comando, a classe de registro do usuário será _COrdersAccessor. Embora a classe de registro de usuário aparece na exibição da classe, clicando duas vezes em navegue até a classe de comando ou da tabela no arquivo de cabeçalho no lugar. Nesses casos, você só pode exibir a declaração real da classe de registro de usuário exibindo o código SQL injetado atributo.
Pode haver complicações potenciais se você adicionar ou substituir os métodos para os consumidores atribuídos. Por exemplo, você pode adicionar um construtor de _COrdersAccessor à declaração de COrders , mas observe que na realidade essa adiciona um construtor para a classe injetada de COrdersAccessor . Como o construtor pode inicializar as colunas/parâmetros, mas não pode criar um construtor de cópia dessa forma, pois não é diretamente criar uma instância do objeto de COrdersAccessor . Se você precisar de um construtor (ou outro método) diretamente na classe de COrders , é recomendável definir uma nova classe que deriva de COrders e adiciona os métodos necessários lá.
No exemplo a seguir, o assistente gerenciar uma declaração da classe COrders, mas a classe de registro COrdersAccessor do usuário não aparecer, como os atributos a injetam.
#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 injetada da classe do comando é semelhante a esta:
class CProducts : public CCommand<CAccessor<_CProductsAccessor> >
A maior parte do código SQL injetado é o mesmo que ou semelhante à versão templated. As principais diferenças nos métodos injetados, que são descritos em Métodos gerados para o consumidor).
Para obter informações sobre o código SQL injetado exibição, consulte Código SQL injetado depuração.
Consulte também
Conceitos
Criando um consumidor de banco de dados OLE sem usar um assistente