CCustomSource (CustomDS.h)

Die Anbieterklassen verwenden mehrere Vererbung. Der folgende Code zeigt die Vererbungskette für das Datenquellenobjekt:

/////////////////////////////////////////////////////////////////////////
// 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>

Alle COM-Komponenten werden von CComObjectRootEx und CComCoClass. CComObjectRootEx stellt die gesamte Implementierung für die IUnknown Schnittstelle bereit. Es kann jedes Threadingmodell verarbeiten. CComCoClass behandelt alle erforderlichen Fehlerunterstützungen. Wenn Sie umfassendere Fehlerinformationen an den Client senden möchten, können Sie einige der Fehler-APIs in CComCoClassverwenden.

Das Datenquellenobjekt erbt auch von mehreren 'Impl'-Klassen. Jede Klasse stellt die Implementierung für eine Schnittstelle bereit. Das Datenquellenobjekt implementiert die IPersistSchnittstellen , , IDBPropertiesund IDBInitializeIDBCreateSession Jede Schnittstelle wird von OLE DB benötigt, um das Datenquellenobjekt zu implementieren. Sie können eine bestimmte Funktionalität unterstützen oder nicht unterstützen, indem Sie eine dieser Impl-Klassen erben oder nicht erben. Wenn Sie die IDBDataSourceAdmin Schnittstelle unterstützen möchten, erben Sie von der IDBDataSourceAdminImpl Klasse, um die erforderliche Funktionalität zu erhalten.

COM-Zuordnung

Wenn der Client eine Schnittstelle in der Datenquelle aufruft QueryInterface , durchläuft er die folgende COM-Karte:

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()

Die COM_INTERFACE_ENTRY Makros stammen aus ATL und teilen der Implementierung QueryInterface CComObjectRootEx mit, dass die entsprechenden Schnittstellen zurückgegeben werden.

Eigenschaftszuordnung

Die Eigenschaftenzuordnung gibt alle vom Anbieter zugewiesenen Eigenschaften an:

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()

Eigenschaften in OLE DB werden gruppiert. Das Datenquellenobjekt verfügt über zwei Eigenschaftengruppen: eine für die DBPROPSET_DATASOURCEINFO und eine für den DBPROPSET_DBINIT Satz. Der satz DBPROPSET_DATASOURCEINFO entspricht Eigenschaften des Anbieters und seiner Datenquelle. Der DBPROPSET_DBINIT Satz entspricht eigenschaften, die bei der Initialisierung verwendet werden. Die OLE DB-Anbietervorlagen behandeln diese Sätze mit den PROPERTY_SET Makros. Die Makros erstellen einen Block, der ein Array von Eigenschaften enthält. Wenn der Client die IDBProperties Schnittstelle aufruft, verwendet der Anbieter die Eigenschaftszuordnung.

Sie müssen nicht jede Eigenschaft in der Spezifikation implementieren. Sie müssen jedoch die erforderlichen Eigenschaften unterstützen; weitere Informationen finden Sie in der Konformitätsspezifikation der Ebene 0. Wenn Sie eine Eigenschaft nicht unterstützen möchten, können Sie sie aus der Karte entfernen. Wenn Sie eine Eigenschaft unterstützen möchten, fügen Sie sie mithilfe eines PROPERTY_INFO_ENTRY Makros in die Karte ein. Das Makro entspricht der UPROPINFO Struktur, wie im folgenden Code dargestellt:

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

Jedes Element in der Struktur stellt Informationen zum Behandeln der Eigenschaft dar. Sie enthält eine DBPROPID , um die GUID und DIE ID für die Eigenschaft zu bestimmen. Es enthält auch Einträge, um den Typ und den Wert der Eigenschaft zu bestimmen.

Wenn Sie den Standardwert einer Eigenschaft ändern möchten (beachten Sie, dass ein Verbraucher den Wert einer schreibbaren Eigenschaft jederzeit ändern kann), können Sie entweder das PROPERTY_INFO_ENTRY_VALUE- oder PROPERTY_INFO_ENTRY_EX-Makro verwenden. Mit diesen Makros können Sie einen Wert für eine entsprechende Eigenschaft angeben. Das PROPERTY_INFO_ENTRY_VALUE Makro ist eine Kurznotation, mit der Sie den Wert ändern können. Das PROPERTY_INFO_ENTRY_VALUE Makro ruft das PROPERTY_INFO_ENTRY_EX Makro auf. Mit diesem Makro können Sie alle Attribute in der UPROPINFO Struktur hinzufügen oder ändern.

Wenn Sie Ihren eigenen Eigenschaftensatz definieren möchten, können Sie einen hinzufügen, indem Sie eine zusätzliche BEGIN_PROPSET_MAP/END_PROPSET_MAP Kombination erstellen. Definieren Sie eine GUID für den Eigenschaftensatz, und definieren Sie dann Ihre eigenen Eigenschaften. Wenn Sie über anbieterspezifische Eigenschaften verfügen, fügen Sie sie einem neuen Eigenschaftensatz hinzu, anstatt eine vorhandene zu verwenden. Dadurch werden Probleme in späteren Versionen von OLE DB vermieden.

Benutzerdefinierte Eigenschaftensätze

Visual C++ unterstützt benutzerdefinierte Eigenschaftensätze. Sie müssen weder außer Kraft setzen GetProperties noch GetPropertyInfo. Stattdessen erkennen die Vorlagen alle benutzerdefinierten Eigenschaftensätze und fügen sie dem entsprechenden Objekt hinzu.

Wenn Sie über einen benutzerdefinierten Eigenschaftensatz verfügen, der zur Initialisierungszeit verfügbar sein muss (d. h., bevor der Consumer aufruft IDBInitialize::Initialize), können Sie dies mithilfe des UPROPSET_USERINIT-Flags zusammen mit dem BEGIN_PROPERTY_SET_EX-Makro angeben. Der Eigenschaftensatz muss sich im Datenquellenobjekt befinden, damit dies funktioniert (wie die OLE DB-Spezifikation erfordert). Zum Beispiel:

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

Siehe auch

Vom Anbieter-Assistenten generierte Dateien