Vygenerované třídy průvodcem příjemce
Použijete-li Průvodce příjemce knihovny ATL technologie OLE DB pro vygenerování příjemce, máte možnost použití šablon technologie OLE DB nebo atributů technologie OLE DB. V obou případech vygeneruje průvodce třídu příkazu a třídu uživatelského záznamu. Třída příkazu obsahuje kód pro otevření zdroje dat a sadu řádků, zadanou v průvodci. Třída uživatelského záznamu obsahuje mapy sloupce pro vybranou databázovou tabulku. Avšak generovaný kód se liší v každém případě:
Pokud jste vybrali šablonového příjemce, vygeneruje průvodce třídu příkazu a třídu uživatelského záznamu. Třída příkazu bude mít název, který zadáte v poli Třída v průvodci (například CProducts), a třída uživatelského záznamu bude mít název, ve tvaru "NázevTřídyAccessor" (například CProductsAccessor). Obě třídy jsou umístěny v souboru hlaviček příjemce.
Vyberete-li atributovaného příjemce, bude mít třída uživatelského záznamu název ve tvaru "_NázevTřídyAccessor" a bude vložená. To znamená, že budete moci zobrazit pouze třídu příkazu v textovém editoru; můžete pouze zobrazit třídu uživatelského záznamu jako vložený kód. Informace o zobrazení vloženého kódu naleznete v tématu Ladění vloženého kódu.
Následující příklady používají vytvořenou třídu příkazu na tabulku Products z databáze Northwind, k předvedení průvodcem vygenerovaného kódu příjemce pro třídu příkazu a třídu uživatelského záznamu.
Šablonové třídy uživatelského záznamu
Pokud jste vytvořili příjemce technologie OLE DB za pomocí šablon technologie OLE DB (spíše než atributů technologie OLE DB), vygeneruje průvodce kód tak, jak je popsáno v tomto oddíle.
Sloupec datových členů
První část třídy uživatelského záznamu obsahuje deklaraci datového člena a stav a délku datových členů pro každý datově vázaný sloupec. Informace o těchto datových členech naleznete v tématu Datové členy stavu pole v přístupových objektech, jenž jsou generovány průvodcem.
Poznámka
Pokud změníte třídu uživatelského záznamu nebo napíšete svého vlastního příjemce, data proměnné musí přijít před stavem a délkou proměnných.
Poznámka
Průvodce příjemce knihovny ATL technologie OLE DB používá typ DB_NUMERIC k navázání číselných datových typů. Dříve používal DBTYPE_VARNUMERIC (formát, jenž je popsán typem DB_VARNUMERIC; viz Oledb.h). Pokud nepoužijete průvodce k vytvoření příjemce, je doporučeno použít 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;
Vlastnosti sady řádků
Dále průvodce nastaví vlastnosti sady řádků. Pokud jste vybrali Change, Insert nebo Delete v Průvodci příjemce knihovny ATL technologie OLE DB, jsou odpovídající vlastnosti nastaveny zde (DBPROP_IRowsetChange je vždy nastavena, pak jedna nebo více DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT a/nebo DBPROPVAL_UP_DELETE, respektive).
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);
}
Třída příkazu nebo třída tabulky
Pokud zadáte třídu příkazu, deklaruje průvodce třídu příkazu; pro šablonový kód vypadá příkaz takto:
DEFINE_COMMAND_EX(CProductsAccessor, L" \
SELECT \
ProductID, \
ProductName, \
SupplierID, \
CategoryID, \
QuantityPerUnit, \
UnitPrice, \
UnitsInStock, \
UnitsOnOrder, \
ReorderLevel, \
Discontinued \
FROM dbo.Products")
Mapa sloupce
Průvodce poté vygeneruje vazby pro sloupec nebo mapu sloupce. Chcete-li vyřešit několik problémů s některými zprostředkovateli, může následující kód vázat sloupce v jiném pořadí než je vykazováno zprostředkovatelem.
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()
};
Deklarace třídy
Nakonec průvodce vygeneruje deklaraci třídy příkazu, například následující:
class CProducts : public CCommand<CAccessor<CProductsAccessor> >
Atributově vložená třída uživatelského záznamu
Pokud vytvoříte příjemce technologie OLE DB pomocí atributů databáze (db_command nebo db_table), vloží atributy třídu uživatelského záznamu s názvem ve tvaru "_NázevTřídyAccessor." Například pokud pojmenujete Vaší třídu přikazu COrders, bude se třída uživatelského záznamu jmenovat _COrdersAccessor. Ačkoliv se třída uživatelského záznamu zobrazí ve Zobrazení tříd, přejdete dvojitým kliknutím k třídě příkazu nebo třídě tabulky v souboru hlaviček. V těchto případech můžete zobrazit pouze skutečnou deklaraci třídy uživatelského záznamu zobrazením atributově vloženého kódu.
Mohou existovat potenciální komplikace, pokud přidáte nebo přepíšete metody v atributovaných příjemcích. Můžete například přidat konstruktor _COrdersAccessor do deklarace COrders, ale všimněte si, že to ve skutečnosti přidá konstruktor do vložené třídy COrdersAccessor. Takový konstruktor může inicializovat sloupce/parametry, nemůžete ale vytvářet kopie konstruktoru tímto způsobem, protože nemůže přímo vytvořit objekt COrdersAccessor. Potřebujete-li konstruktor (nebo jinou metodu) přímo ve třídě COrders, je vhodné definovat novou třídu, odvozenou z COrders a zde přidat nezbytné metody.
V následujícím příkladu vygeneruje průvodce deklaraci pro třídu COrders, ale třída uživatelského záznamu COrdersAccessor se nezobrazí, protože vloží atributy.
#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];
};
Deklarace vložené třída příkazu vypadá takto:
class CProducts : public CCommand<CAccessor<_CProductsAccessor> >
Většina vloženého kódu je stejná nebo podobná jako ze šablonové verze. Hlavní rozdíly spočívají ve vložených metodách, které jsou popsány v tématu Vygenerované metody průvodcem příjemce.
Informace o zobrazení vloženého kódu naleznete v tématu Ladění vloženého kódu.