Condividi tramite


CCustomSource (CustomDS.h)

Le classi del provider usano più ereditarietà. Il codice seguente illustra la catena di ereditarietà per l'oggetto origine dati:

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

Tutti i componenti COM derivano da CComObjectRootEx e CComCoClass. CComObjectRootEx fornisce tutta l'implementazione per l'interfaccia IUnknown . Può gestire qualsiasi modello di threading. CComCoClass gestisce qualsiasi supporto per gli errori richiesto. Se si desidera inviare informazioni di errore più complete al client, è possibile usare alcune delle API di errore in CComCoClass.

L'oggetto origine dati eredita anche da diverse classi 'Impl'. Ogni classe fornisce l'implementazione per un'interfaccia. L'oggetto origine dati implementa le IPersistinterfacce , IDBProperties, IDBInitializee IDBCreateSession . Ogni interfaccia è richiesta da OLE DB per implementare l'oggetto origine dati. È possibile scegliere di supportare o non supportare funzionalità specifiche ereditando o non ereditando da una di queste classi 'Impl'. Se si vuole supportare l'interfaccia IDBDataSourceAdmin , si eredita dalla IDBDataSourceAdminImpl classe per ottenere le funzionalità necessarie.

Mappa COM

Ogni volta che il client chiama QueryInterface un'interfaccia nell'origine dati, passa attraverso la mappa COM seguente:

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

Le macro COM_INTERFACE_ENTRY provengono da ATL e indicano l'implementazione di QueryInterface in CComObjectRootEx per restituire le interfacce appropriate.

Mappa delle proprietà

La mappa delle proprietà specifica tutte le proprietà assegnate dal provider:

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

Le proprietà in OLE DB sono raggruppate. L'oggetto origine dati ha due gruppi di proprietà: uno per il set di DBPROPSET_DATASOURCEINFO e uno per il set di DBPROPSET_DBINIT. Il set di DBPROPSET_DATASOURCEINFO corrisponde alle proprietà relative al provider e all'origine dati. Il set di DBPROPSET_DBINIT corrisponde alle proprietà utilizzate durante l'inizializzazione. I modelli di provider OLE DB gestiscono questi set con le macro PROPERTY_SET. Le macro creano un blocco che contiene una matrice di proprietà. Ogni volta che il client chiama l'interfaccia IDBProperties , il provider usa la mappa delle proprietà.

Non è necessario implementare tutte le proprietà nella specifica. Tuttavia, è necessario supportare le proprietà necessarie; per altre informazioni, vedere la specifica di conformità di livello 0. Se non si vuole supportare una proprietà, è possibile rimuoverla dalla mappa. Se si desidera supportare una proprietà, aggiungerla alla mappa usando una macro PROPERTY_INFO_ENTRY. La macro corrisponde alla UPROPINFO struttura come illustrato nel codice seguente:

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

Ogni elemento della struttura rappresenta le informazioni per gestire la proprietà. Contiene un oggetto DBPROPID per determinare il GUID e l'ID per la proprietà . Contiene anche voci per determinare il tipo e il valore della proprietà.

Se si desidera modificare il valore predefinito di una proprietà (si noti che un consumer può modificare il valore di una proprietà scrivibile in qualsiasi momento), è possibile utilizzare la macro PROPERTY_INFO_ENTRY_VALUE o PROPERTY_INFO_ENTRY_EX. Queste macro consentono di specificare un valore per una proprietà corrispondente. La macro PROPERTY_INFO_ENTRY_VALUE è una notazione abbreviata che consente di modificare il valore. La macro PROPERTY_INFO_ENTRY_VALUE chiama la macro PROPERTY_INFO_ENTRY_EX. Questa macro consente di aggiungere o modificare tutti gli attributi nella UPROPINFO struttura.

Se si desidera definire un set di proprietà personalizzato, è possibile aggiungerne uno creando una combinazione di BEGIN_PROPSET_MAP/END_PROPSET_MAP aggiuntiva. Definire un GUID per il set di proprietà e quindi definire le proprie proprietà. Se si dispone di proprietà specifiche del provider, aggiungerle a un nuovo set di proprietà invece di usarne una esistente. In questo modo si evitano problemi nelle versioni successive di OLE DB.

Set di proprietà definiti dall'utente

Visual C++ supporta i set di proprietà definiti dall'utente. Non è necessario eseguire l'override GetProperties di o GetPropertyInfo. I modelli rilevano invece qualsiasi set di proprietà definito dall'utente e lo aggiungono all'oggetto appropriato.

Se si dispone di un set di proprietà definito dall'utente che deve essere disponibile in fase di inizializzazione, ovvero prima delle chiamate IDBInitialize::Initializedel consumer, è possibile specificarlo usando il flag UPROPSET_USERINIT insieme alla macro BEGIN_PROPERTY_SET_EX. Il set di proprietà deve trovarsi nell'oggetto origine dati per il funzionamento dell'oggetto (come richiesto dalla specifica OLE DB). Ad esempio:

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

Vedi anche

File del provider generati tramite procedura guidata