Klasy konsumentów generowane przez kreatora
Kiedy Kreator ATL OLE DB konsumenta do generowania konsumenta, masz wybór przy użyciu atrybutów szablonów OLE DB lub OLE DB.W obu przypadkach kreator generuje polecenia klasa i klasy rekordu użytkownika.Klasa polecenia zawiera kod, aby otworzyć źródło danych i zestaw wierszy, określona w kreatorze.Klasa rekordu użytkownika zawiera mapę kolumny dla wybranej tabeli bazy danych.Jednak wygenerowany kod różnią się w każdym przypadku:
Jeśli wybierzesz opartych na szablonach konsumenta, Kreator generuje polecenia klasa i klasy rekordu użytkownika.Klasa polecenia będzie mieć nazwę, która zostanie wprowadzona w polu Klasa w Kreatorze (na przykład CProducts), i klasy rekordu użytkownika będzie miał nazwę formularza "Nazwa_klasyakcesor" (na przykład CProductsAccessor).Obie klasy znajdują się w pliku nagłówka konsumenta.
Jeśli wybierzesz przypisane konsumenta, klasa rekordu użytkownika będzie miał nazwę formularza "_Nazwa_klasyakcesor" i zostaną dodane.To znaczy będzie można wyświetlić tylko klasy polecenia w edytorze tekstów; rekord klasy użytkownika można wyświetlać tylko jako wtryskiwanego kod.Aby uzyskać informacji o przeglądaniu wtryskiwanego kod, zobacz Debugowanie kodu wstrzykuje się.
W następujących przykładach użyto polecenia klasy tworzone na tabeli Produkty w bazie danych Northwind do wykazania kod wygenerowany przez kreatora konsumentów klasy polecenia i klasy rekordu użytkownika.
Klasę rekordu użytkownika opartych na szablonach
Jeśli tworzysz konsumenta OLE DB przy użyciu szablonów OLE DB (zamiast atrybuty OLE DB), Kreator generuje kod opisane w tej sekcji.
Elementy członkowskie dla kolumn danych
Pierwsza część klasy rekordu użytkownika zawiera deklaracje członków danych i członkowie danych stanu i długości dla każdej kolumny powiązany z danymi.Aby uzyskać informacje o tych danych członków, zobacz Pole Stan danych członków w akcesorach Wizard-Generated.
[!UWAGA]
W przypadku zmiany rekordu klasy użytkownika lub pisać własne konsumenta, zmienne dane muszą znajdować się przed zmienne stanu i długość.
[!UWAGA]
ATL OLE DB konsumenta kreator używa DB_NUMERIC typu powiązać liczbowych typów danych.Kiedyś dawniej DBTYPE_VARNUMERIC (format jest opisana przez skojarzenie DB_VARNUMERIC wpisz; patrz: Oledb.h).Jeśli Kreator nie umożliwia tworzenia konsumentów, zaleca się użycie 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;
Właściwości zestaw wierszy
Następnie Kreator ustawia właściwości zestaw wierszy.W przypadku wybrania zmiany, Wstaw, lub usunąć biblioteki ATL OLE DB konsumenta kreatora, odpowiednie właściwości są ustawione tu (DBPROP_IRowsetChange jest zawsze zestaw, a następnie jeden lub więcej DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT i/lub DBPROPVAL_UP_DELETE, odpowiednio).
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);
}
Polecenie lub klasy tabeli
Jeśli określisz klasa polecenia kreatora deklaruje klasy polecenia; Kod, opartych na szablonach polecenie wygląda następująco:
DEFINE_COMMAND_EX(CProductsAccessor, L" \
SELECT \
ProductID, \
ProductName, \
SupplierID, \
CategoryID, \
QuantityPerUnit, \
UnitPrice, \
UnitsInStock, \
UnitsOnOrder, \
ReorderLevel, \
Discontinued \
FROM dbo.Products")
Mapowanie kolumn
Kreator generuje następnie powiązania kolumna lub kolumny mapy.Aby rozwiązać kilka problemów z niektórych dostawców, poniższy kod może powiązać kolumny w innej kolejności niż zgłoszone przez dostawcę.
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()
};
Deklaracja klasy
Wreszcie Kreator generuje deklarację klasy polecenia takie jak następujące:
class CProducts : public CCommand<CAccessor<CProductsAccessor> >
Rekord klasy użytkowników wstrzykuje się do atrybutu
Jeśli utworzysz konsumenta przy użyciu atrybutów bazy danych OLE DB (db_command lub db_table), atrybuty wstrzyknąć klasę rekordu użytkownika o nazwie formularza "_Nazwa_klasyakcesor." Na przykład, jeśli użytkownik o nazwie klasy polecenia COrders, klasy rekordu użytkownika będzie _COrdersAccessor.Mimo że klasa rekordu użytkownika pojawi się w widoku klasy, dwukrotne kliknięcie nawiguje do polecenia lub tabeli klasy w pliku nagłówkowym zamiast.W tych przypadkach rzeczywiste deklaracji rekordu klasy użytkownika można wyświetlać tylko przeglądając kod wstrzykuje się do atrybutu.
Potencjalnych powikłań może istnieć, jeśli dodać lub zastąpić metody w przypisane konsumentów.Na przykład, można dodać _COrdersAccessor Konstruktor do COrders deklarację, ale należy pamiętać, że w rzeczywistości służy do dodania Konstruktor wtryskiwanego COrdersAccessor klasy.Takie Konstruktor można zainicjować kolumn i/lub parametry, ale nie można utworzyć Konstruktor kopiujący ten sposób, ponieważ go nie można bezpośrednio utworzyć wystąpienia COrdersAccessor obiektu.Jeśli potrzebujesz konstruktora (lub inna metoda) bezpośrednio na COrders klasy, zaleca się zdefiniowanie nowej klasy, wynikających z COrders i dodać tam niezbędne metody.
W poniższym przykładzie, Kreator generuje deklaracja klasy COrders, ale rekord klasy użytkownika COrdersAccessor nie jest wyświetlany, ponieważ atrybuty wstrzyknąć.
#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];
};
Deklaracja klasy polecenia wtryskiwanego wygląda następująco:
class CProducts : public CCommand<CAccessor<_CProductsAccessor> >
Większość wtryskiwanego kod jest taki sam lub podobny do wersji opartych na szablonach.Podstawową różnicą jest w wtryskiwanego metody, które są opisane w Metody Consumer Wizard-Generated.
Aby uzyskać informacji o przeglądaniu wtryskiwanego kod, zobacz Debugowanie kodu wstrzykuje się.