Třídy generované v průvodci příjemcem
Průvodce příjemcem ATL OLE DB není v sadě Visual Studio 2019 a novější k dispozici. Funkci můžete přidat ručně.
Pokud použijete Průvodce příjemcem ATL OLE DB ke generování příjemce, máte možnost použít šablony OLE DB nebo atributy OLE DB. V obou případech průvodce vygeneruje třídu příkazů a třídu záznamů uživatele. Třída příkazů obsahuje kód pro otevření zdroje dat a sady řádků, které jste zadali v průvodci. Třída záznamů uživatele obsahuje mapu sloupců pro tabulku databáze, kterou jste vybrali. Vygenerovaný kód se ale v každém případě liší:
Pokud vyberete příjemce šablony, průvodce vygeneruje třídu příkazů a třídu záznamů uživatele. Třída příkazu bude mít název, který zadáte do pole Třída v průvodci (například
CProducts
) a třída záznamu uživatele bude mít název formuláře ClassName Accessor (napříkladCProductsAccessor
). Obě třídy jsou umístěny v souboru hlavičky příjemce.Pokud vyberete přiřazeného příjemce, třída záznamu uživatele bude mít název formuláře "_ClassNameAccessor" a vloží se. To znamená, že budete moci zobrazit pouze třídu příkazů v textovém editoru; třídu záznamů uživatele můžete zobrazit pouze jako vložený kód. Informace o zobrazení vloženého kódu naleznete v tématu Ladění vložený kód.
Následující příklady používají třídu příkazů vytvořenou v Products
tabulce Northwind
databáze k předvedení kódu příjemce generovaného průvodcem pro třídu příkazů a třídu záznamu uživatele.
Třídy záznamů uživatele šablony
Pokud vytvoříte příjemce OLE DB pomocí šablon OLE DB (místo atributů OLE DB), průvodce vygeneruje kód, jak je popsáno v této části.
Datové členy sloupců
První část třídy záznamů uživatele obsahuje deklarace datového členu a stav a délku datových členů pro každý sloupec vázaný na data. Informace o těchto datových členech naleznete v části Datové členy stavu pole v Průvodci generované přístupové objekty.
Poznámka:
Pokud upravíte třídu záznamů uživatele nebo napíšete vlastního příjemce, musí proměnné dat předcházet stavu a proměnným délky.
Poznámka:
Průvodce příjemcem ATL OLE DB používá DB_NUMERIC
typ k vytvoření vazby číselných datových typů. Dříve použitý DBTYPE_VARNUMERIC
(formát, který je popsán typem DB_VARNUMERIC
, viz Oledb.h). Pokud průvodce nepoužíváte k vytváření příjemců, doporučuje se 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 v Průvodci příjemcem ATL OLE DB vybrali možnost Změnit, Vložit nebo Odstranit , nastaví se sem příslušné vlastnosti (DBPROP_IRowsetChange je vždy nastavená, jedna nebo více DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT a/nebo DBPROPVAL_UP_DELETE).
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říkazů nebo tabulek
Pokud zadáte třídu příkazů, průvodce deklaruje třídu příkazů; pro kód šablony vypadá příkaz takto:
DEFINE_COMMAND_EX(CProductsAccessor, L" \
SELECT \
ProductID, \
ProductName, \
SupplierID, \
CategoryID, \
QuantityPerUnit, \
UnitPrice, \
UnitsInStock, \
UnitsOnOrder, \
ReorderLevel, \
Discontinued \
FROM dbo.Products")
Mapa sloupců
Průvodce pak vygeneruje vazby sloupců nebo mapování sloupců. Pokud chcete vyřešit několik problémů s některými poskytovateli, následující kód může svázat sloupce v jiném pořadí, než který zprostředkovatel nahlásil.
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říkazů, například následující:
class CProducts : public CCommand<CAccessor<CProductsAccessor>>
Třídy záznamů uživatele vložené do atributů
Pokud vytvoříte příjemce OLE DB pomocí atributů databáze (db_command nebo db_table), atributy vloží třídu záznamů uživatele s názvem formuláře "_ClassNameAccessor". Pokud jste například pojmenovali třídu COrders
příkazů, třída záznamu uživatele bude _COrdersAccessor
. I když se třída záznamu uživatele zobrazí v zobrazení třídy, poklikáním na ni přejdete na příkaz nebo třídu tabulky v souboru záhlaví. V těchto případech můžete zobrazit pouze skutečnou deklaraci třídy záznamů uživatele zobrazením kódu vloženého atributem.
Pokud přidáte nebo přepíšete metody v přísežných konzumentech, může dojít k potenciálním komplikacím. Můžete například přidat _COrdersAccessor
konstruktor do COrders
deklarace, ale ve skutečnosti to přidá konstruktor do vložené COrdersAccessor
třídy. Takový konstruktor může inicializovat sloupce nebo parametry, ale tímto způsobem nelze vytvořit konstruktor kopírování, protože nemůže přímo vytvořit instanci objektu COrdersAccessor
. Pokud potřebujete konstruktor (nebo jinou metodu) přímo ve COrders
třídě, doporučujeme definovat novou třídu odvozenou z COrders
a přidat do ní potřebné metody.
V následujícím příkladu průvodce vygeneruje deklaraci pro třídu COrders
, ale třída záznamu COrdersAccessor
uživatele se nezobrazí, protože atributy jej vloží.
#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řídy příkazů vypadá takto:
class CProducts : public CCommand<CAccessor<_CProductsAccessor>>
Většina vloženého kódu je stejná jako nebo podobná šablonované verzi. Hlavní rozdíly jsou v injektovaných metodách, které jsou popsány v Průvodci příjemcem generované metody.
Informace o zobrazení vloženého kódu naleznete v tématu Ladění vložený kód.