Konsument klas generowanych przez kreatora
ATL OLE DB konsumenta Kreator umożliwia generowanie konsumenta, masz wybór przy użyciu atrybutów szablonów OLE DB lub OLE DB.W obu przypadkach kreator generuje klasy polecenia i klasy rekordu użytkownika.Klasa polecenia zawiera kod, aby otworzyć źródło danych i wierszy, określonej w kreatorze.Klasa rekordu użytkownika zawiera mapę kolumny dla zaznaczonej tabeli bazy danych.Wygenerowany kod różni się jednak w każdym przypadku:
Wybranie szablonu konsumenta, Kreator generuje klasy polecenia 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 mieć nazwę formularza, "ClassNameakcesor" (na przykład CProductsAccessor).Obie klasy znajdują się w pliku nagłówkowym konsumenta.
Wybranie przypisane konsumenta, nazwa formularza będzie klasę rekordu użytkownika "_ClassNameakcesor" i zostaną dodane.Oznacza to, że będzie można wyświetlić tylko klasy polecenia w edytorze tekstowym; Klasa rekordu użytkownika można przeglądać tylko jako kod.Informacje o wyświetlaniu takiego kodu, zobacz Debugowania kodu wstrzykiwana.
W następujących przykładach użyto polecenia klasy utworzone w tabeli Produkty do wykazania kod wygenerowany przez kreatora konsumenta klasy polecenia bazę danych Northwind i klasy rekordu użytkownika.
Opartą na szablonie klasy rekordu użytkownika
Jeśli tworzysz konsumenta OLE DB przy użyciu szablonów OLE DB (a nie atrybuty OLE DB), Kreator generuje kod opisane w tej sekcji.
Kolumny danych członków
Pierwsza część klasy rekordu użytkownika zawiera dane deklaracje członków i członków danych stanu i długości dla każdej kolumny powiązane z danymi.Informacje o tych członków danych, zobacz Pole Stan danych członków w akcesorach Wizard-Generated.
[!UWAGA]
Modyfikowanie rekordu klasy użytkownika lub napisać własny konsumenta, zmienne dane muszą znajdować się przed zmienne stanu i długości.
[!UWAGA]
ATL OLE DB konsumenta kreator używa DB_NUMERIC typu powiązać liczbowych typów danych.On wcześniej używany DBTYPE_VARNUMERIC (format, który jest opisany przez DB_VARNUMERIC typu; Zobacz Oledb.h).Jeśli nie używasz kreatora do tworzenia konsumentów, zaleca się za pomocą 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 wierszy
Następnie Kreator ustawia właściwości zestawu wierszy.Jeśli wybrano zmiany, wstawić, lub usunąć ATL OLE DB konsumenta kreatora, odpowiednie właściwości są ustawione tutaj (DBPROP_IRowsetChange jest zawsze ustawiona, następnie jeden lub więcej DBPROPVAL_UP_CHANGE, DBPROPVAL_UP_INSERT 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 tabeli, klasa
Jeśli określisz klasy polecenia kreatora deklaruje klasy polecenia; kod, opartą na szablonie 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")
Mapa kolumny
Następnie Kreator generuje wiązania kolumnę lub kolumny mapy.Aby rozwiązać wiele problemów z niektórych dostawców, następujący kod może powiązać kolumn 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 polecenie deklaracja klasy, takie jak:
class CProducts : public CCommand<CAccessor<CProductsAccessor> >
Wstrzykiwana atrybut klasy rekordu użytkownika
Jeśli tworzysz konsumenta OLE DB przy użyciu atrybutów bazy danych (db_command lub db_table), atrybuty wstrzyknąć klasę rekordu użytkownika o nazwie formularza "_ClassNameakcesor." Na przykład, jeśli w nazwie polecenia klasy COrders, klasa rekordu użytkownika będzie _COrdersAccessor.Chociaż klasa rekordu użytkownika pojawia się w widoku klasy, dwukrotne kliknięcie nawiguje do polecenia lub tabeli klasy w pliku nagłówkowym zamiast.W tych przypadkach rzeczywiste deklarację klasy rekordu użytkownika można przeglądać tylko przeglądając kod wstrzykiwana atrybutu.
Jeśli dodasz lub zastąpić metody w przypisane konsumentów, może być potencjalnym komplikacji.Na przykład, można dodać _COrdersAccessor Konstruktor do COrders deklaracji, ale Uwaga, że w rzeczywistości służy do dodania Konstruktor wniesiony COrdersAccessor klasy.Takie konstruktora można zainicjować kolumn i/lub parametry, ale nie można utworzyć Konstruktor kopię w ten sposób, ponieważ nie można bezpośrednio wystąpienia COrdersAccessor obiektu.Jeśli potrzebujesz Konstruktor (lub innej metody) bezpośrednio na COrders klasy, zaleca, aby zdefiniować nową klasę wynikających z COrders i dodać niezbędne metody istnieją.
W poniższym przykładzie, Kreator generuje deklarację klasy COrders, ale klasa rekordu użytkownika COrdersAccessor nie jest wyświetlany, ponieważ atrybuty wstrzyknąć go.
#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 wniesiony wygląda następująco:
class CProducts : public CCommand<CAccessor<_CProductsAccessor> >
Większość takiego kodu jest ten sam lub podobny do wersji opartą na szablonie.Są główne różnice w metodach wniesiony, które są opisane w Metody Consumer Wizard-Generated.
Informacje o wyświetlaniu takiego kodu, zobacz Debugowania kodu wstrzykiwana.