Udostępnij za pośrednictwem


CCustomSource (CustomDS.h)

Klasy dostawców używają wielu dziedziczenia. Poniższy kod przedstawia łańcuch dziedziczenia dla obiektu źródła danych:

/////////////////////////////////////////////////////////////////////////
// CCustomSource
class ATL_NO_VTABLE CCustomSource :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CCustomSource, &CLSID_Custom>,
   public IDBCreateSessionImpl<CCustomSource, CCustomSession>,
   public IDBInitializeImpl<CCustomSource>,
   public IDBPropertiesImpl<CCustomSource>,
   public IPersistImpl<CCustomSource>,
   public IInternalConnectionImpl<CCustomSource>

Wszystkie składniki MODELU COM pochodzą z CComObjectRootEx elementów i CComCoClass. CComObjectRootEx zapewnia całą implementację interfejsu IUnknown . Może obsługiwać dowolny model wątków. CComCoClass obsługuje wymaganą obsługę błędów. Jeśli chcesz wysłać bogatsze informacje o błędzie do klienta, możesz użyć niektórych interfejsów API błędów w programie CComCoClass.

Obiekt źródła danych dziedziczy również z kilku klas "Impl". Każda klasa udostępnia implementację interfejsu. Obiekt źródła danych implementuje IPersistinterfejsy , IDBProperties, IDBInitializei IDBCreateSession . Każdy interfejs jest wymagany przez bazę danych OLE DB do zaimplementowania obiektu źródła danych. Możesz wybrać obsługę lub nie obsługiwać określonych funkcji, dziedzicząc lub nie dziedzicząc z jednej z tych klas "Impl". Jeśli chcesz obsługiwać IDBDataSourceAdmin interfejs, dziedziczysz z IDBDataSourceAdminImpl klasy, aby uzyskać wymagane funkcje.

Mapa MODELU COM

Za każdym razem, gdy klient wywołuje QueryInterface interfejs w źródle danych, przechodzi przez następującą mapę COM:

BEGIN_COM_MAP(CCustomSource)
   COM_INTERFACE_ENTRY(IDBCreateSession)
   COM_INTERFACE_ENTRY(IDBInitialize)
   COM_INTERFACE_ENTRY(IDBProperties)
   COM_INTERFACE_ENTRY(IPersist)
   COM_INTERFACE_ENTRY(IInternalConnection)
END_COM_MAP()

Makra COM_INTERFACE_ENTRY pochodzą z ATL i informują implementację QueryInterface elementu w CComObjectRootEx , aby zwrócić odpowiednie interfejsy.

Mapa właściwości

Mapa właściwości określa wszystkie właściwości przypisane przez dostawcę:

BEGIN_PROPSET_MAP(CCustomSource)
   BEGIN_PROPERTY_SET(DBPROPSET_DATASOURCEINFO)
      PROPERTY_INFO_ENTRY(ACTIVESESSIONS)
      PROPERTY_INFO_ENTRY(ASYNCTXNABORT)
      PROPERTY_INFO_ENTRY(ASYNCTXNCOMMIT)
      PROPERTY_INFO_ENTRY(BYREFACCESSORS)
      PROPERTY_INFO_ENTRY_VALUE(CATALOGLOCATION, DBPROPVAL_CL_START)
      PROPERTY_INFO_ENTRY(CATALOGTERM)
      PROPERTY_INFO_ENTRY(CATALOGUSAGE)
      PROPERTY_INFO_ENTRY(COLUMNDEFINITION)
      PROPERTY_INFO_ENTRY(CONCATNULLBEHAVIOR)
      PROPERTY_INFO_ENTRY(DATASOURCENAME)
      PROPERTY_INFO_ENTRY(DATASOURCEREADONLY)
      PROPERTY_INFO_ENTRY(DBMSNAME)
      PROPERTY_INFO_ENTRY(DBMSVER)
      PROPERTY_INFO_ENTRY_VALUE(DSOTHREADMODEL, DBPROPVAL_RT_FREETHREAD)
      PROPERTY_INFO_ENTRY(GROUPBY)
      PROPERTY_INFO_ENTRY(HETEROGENEOUSTABLES)
      PROPERTY_INFO_ENTRY(IDENTIFIERCASE)
      PROPERTY_INFO_ENTRY(MAXINDEXSIZE)
      PROPERTY_INFO_ENTRY(MAXROWSIZE)
      PROPERTY_INFO_ENTRY(MAXROWSIZEINCLUDESBLOB)
      PROPERTY_INFO_ENTRY(MAXTABLESINSELECT)
      PROPERTY_INFO_ENTRY(MULTIPLEPARAMSETS)
      PROPERTY_INFO_ENTRY(MULTIPLERESULTS)
      PROPERTY_INFO_ENTRY(MULTIPLESTORAGEOBJECTS)
      PROPERTY_INFO_ENTRY(MULTITABLEUPDATE)
      PROPERTY_INFO_ENTRY(NULLCOLLATION)
      PROPERTY_INFO_ENTRY(OLEOBJECTS)
      PROPERTY_INFO_ENTRY(ORDERBYCOLUMNSINSELECT)
      PROPERTY_INFO_ENTRY(OUTPUTPARAMETERAVAILABILITY)
      PROPERTY_INFO_ENTRY(PERSISTENTIDTYPE)
      PROPERTY_INFO_ENTRY(PREPAREABORTBEHAVIOR)
      PROPERTY_INFO_ENTRY(PREPARECOMMITBEHAVIOR)
      PROPERTY_INFO_ENTRY(PROCEDURETERM)
      PROPERTY_INFO_ENTRY(PROVIDERNAME)
      PROPERTY_INFO_ENTRY(PROVIDEROLEDBVER)
      PROPERTY_INFO_ENTRY(PROVIDERVER)
      PROPERTY_INFO_ENTRY(QUOTEDIDENTIFIERCASE)
      PROPERTY_INFO_ENTRY(ROWSETCONVERSIONSONCOMMAND)
      PROPERTY_INFO_ENTRY(SCHEMATERM)
      PROPERTY_INFO_ENTRY(SCHEMAUSAGE)
      PROPERTY_INFO_ENTRY(STRUCTUREDSTORAGE)
      PROPERTY_INFO_ENTRY(SUBQUERIES)
      PROPERTY_INFO_ENTRY(TABLETERM)
      PROPERTY_INFO_ENTRY(USERNAME)
   END_PROPERTY_SET(DBPROPSET_DATASOURCEINFO)
   BEGIN_PROPERTY_SET(DBPROPSET_DBINIT)
      PROPERTY_INFO_ENTRY(AUTH_PASSWORD)
      PROPERTY_INFO_ENTRY(AUTH_PERSIST_SENSITIVE_AUTHINFO)
      PROPERTY_INFO_ENTRY(AUTH_USERID)
      PROPERTY_INFO_ENTRY(INIT_DATASOURCE)
      PROPERTY_INFO_ENTRY(INIT_HWND)
      PROPERTY_INFO_ENTRY(INIT_LCID)
      PROPERTY_INFO_ENTRY(INIT_LOCATION)
      PROPERTY_INFO_ENTRY(INIT_MODE)
      PROPERTY_INFO_ENTRY(INIT_PROMPT)
      PROPERTY_INFO_ENTRY(INIT_PROVIDERSTRING)
      PROPERTY_INFO_ENTRY(INIT_TIMEOUT)
   END_PROPERTY_SET(DBPROPSET_DBINIT)
   BEGIN_PROPERTY_SET(DBPROPSET_DATASOURCE)
      PROPERTY_INFO_ENTRY(CURRENTCATALOG)
   END_PROPERTY_SET(DBPROPSET_DATASOURCE)
   CHAIN_PROPERTY_SET(CCustomSession)
END_PROPSET_MAP()

Właściwości w bazie danych OLE DB są pogrupowane. Obiekt źródła danych ma dwie grupy właściwości: jedną dla zestawu DBPROPSET_DATASOURCEINFO i jedną dla zestawu DBPROPSET_DBINIT. Zestaw DBPROPSET_DATASOURCEINFO odpowiada właściwościom dostawcy i jego źródła danych. Zestaw DBPROPSET_DBINIT odpowiada właściwościom używanym podczas inicjowania. Szablony dostawcy OLE DB obsługują te zestawy za pomocą makr PROPERTY_SET. Makra tworzą blok zawierający tablicę właściwości. Za każdym razem, gdy klient wywołuje IDBProperties interfejs, dostawca używa mapy właściwości.

Nie trzeba implementować każdej właściwości w specyfikacji. Należy jednak obsługiwać wymagane właściwości; Aby uzyskać więcej informacji, zobacz specyfikację zgodności poziomu 0. Jeśli nie chcesz obsługiwać właściwości, możesz usunąć ją z mapy. Jeśli chcesz obsługiwać właściwość, dodaj ją do mapy przy użyciu makra PROPERTY_INFO_ENTRY. Makro odpowiada UPROPINFO strukturze, jak pokazano w poniższym kodzie:

struct UPROPINFO
{
   DBPROPID    dwPropId;
   ULONG       ulIDS;
   VARTYPE     VarType;
   DBPROPFLAGS dwFlags;
   union
   {
      DWORD dwVal;
      LPOLESTR szVal;
   };
   DBPROPOPTIONS dwOption;
};

Każdy element w strukturze reprezentuje informacje do obsługi właściwości. Zawiera element w DBPROPID celu określenia identyfikatora GUID i identyfikatora właściwości . Zawiera również wpisy określające typ i wartość właściwości.

Jeśli chcesz zmienić wartość domyślną właściwości (należy pamiętać, że użytkownik może zmienić wartość właściwości zapisywalnej w dowolnym momencie), możesz użyć makra PROPERTY_INFO_ENTRY_VALUE lub PROPERTY_INFO_ENTRY_EX. Te makra umożliwiają określenie wartości odpowiedniej właściwości. Makro PROPERTY_INFO_ENTRY_VALUE jest skróconą notacją, która umożliwia zmianę wartości. Makro PROPERTY_INFO_ENTRY_VALUE wywołuje makro PROPERTY_INFO_ENTRY_EX. To makro umożliwia dodawanie lub zmienianie wszystkich atrybutów w UPROPINFO strukturze.

Jeśli chcesz zdefiniować własny zestaw właściwości, możesz dodać go, tworząc dodatkową kombinację BEGIN_PROPSET_MAP/END_PROPSET_MAP. Zdefiniuj identyfikator GUID zestawu właściwości, a następnie zdefiniuj własne właściwości. Jeśli masz właściwości specyficzne dla dostawcy, dodaj je do nowego zestawu właściwości zamiast używać istniejącego. Pozwala to uniknąć problemów w nowszych wersjach OLE DB.

Zestawy właściwości zdefiniowanych przez użytkownika

Język Visual C++ obsługuje zestawy właściwości zdefiniowanych przez użytkownika. Nie musisz przesłonić GetProperties ani GetPropertyInfo. Zamiast tego szablony wykrywają dowolny zestaw właściwości zdefiniowanych przez użytkownika i dodają go do odpowiedniego obiektu.

Jeśli masz zestaw właściwości zdefiniowanych przez użytkownika, który musi być dostępny w czasie inicjowania (tj. przed wywołaniami IDBInitialize::Initializekonsumenta), możesz to określić przy użyciu flagi UPROPSET_USERINIT wraz z makrem BEGIN_PROPERTY_SET_EX. Zestaw właściwości musi znajdować się w obiekcie źródła danych, aby działał (zgodnie ze specyfikacją OLE DB). Na przykład:

BEGIN_PROPERTY_SET_EX(DBPROPSET_MYPROPSET, UPROPSET_USERINIT)
   PROPERTY_INFO_ENTRY(DBPROP_MYPROP)
END_PROPERTY_SET_EX(DBPROPSET_MYPROPSET)

Zobacz też

Pliki dostawcy generowane przez kreatora