Udostępnij za pośrednictwem


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.

6e230s5w.collapse_all(pl-pl,VS.110).gifKolumny 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;

6e230s5w.collapse_all(pl-pl,VS.110).gifWł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);
   }

6e230s5w.collapse_all(pl-pl,VS.110).gifPolecenie 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")

6e230s5w.collapse_all(pl-pl,VS.110).gifMapa 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()
};

6e230s5w.collapse_all(pl-pl,VS.110).gifDeklaracja 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.

Zobacz też

Koncepcje

Tworzenie konsumenta DB OLE, za pomocą Kreatora