Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 IPersist
interfejsy , IDBProperties
, IDBInitialize
i 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::Initialize
konsumenta), 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)