Partager via


CCustomSource (CustomDS.h)

Les classes de fournisseur utilisent plusieurs héritages. Le code suivant montre la chaîne d’héritage de l’objet source de données :

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

Tous les composants COM dérivent de CComObjectRootEx et CComCoClass. CComObjectRootEx fournit toutes les implémentations de l’interface IUnknown . Il peut gérer n’importe quel modèle de threading. CComCoClass gère toute prise en charge des erreurs requise. Si vous souhaitez envoyer des informations d’erreur plus riches au client, vous pouvez utiliser certaines API d’erreur dans CComCoClass.

L’objet source de données hérite également de plusieurs classes « Impl ». Chaque classe fournit l’implémentation d’une interface. L’objet source de données implémente les interfaces et les IPersistinterfacesIDBPropertiesIDBInitializeIDBCreateSession. Chaque interface est requise par OLE DB pour implémenter l’objet source de données. Vous pouvez choisir de prendre en charge ou de ne pas prendre en charge des fonctionnalités particulières en héritent ou non de l’une de ces classes « Impl ». Si vous souhaitez prendre en charge l’interface IDBDataSourceAdmin , vous héritez de la IDBDataSourceAdminImpl classe pour obtenir les fonctionnalités requises.

Carte COM

Chaque fois que le client appelle QueryInterface une interface sur la source de données, il passe par la carte COM suivante :

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

Les macros COM_INTERFACE_ENTRY proviennent d’ATL et indiquent à l’implémentation d’in QueryInterface CComObjectRootEx pour retourner les interfaces appropriées.

Mappage des propriétés

Le mappage de propriétés spécifie toutes les propriétés affectées par le fournisseur :

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

Les propriétés dans OLE DB sont regroupées. L’objet source de données a deux groupes de propriétés : un pour le jeu de DBPROPSET_DATASOURCEINFO et un pour l’ensemble de DBPROPSET_DBINIT. Le jeu DBPROPSET_DATASOURCEINFO correspond aux propriétés relatives au fournisseur et à sa source de données. Le jeu DBPROPSET_DBINIT correspond aux propriétés utilisées lors de l’initialisation. Les modèles de fournisseur OLE DB gèrent ces ensembles avec les macros PROPERTY_SET. Les macros créent un bloc qui contient un tableau de propriétés. Chaque fois que le client appelle l’interface IDBProperties , le fournisseur utilise le mappage de propriétés.

Vous n’avez pas besoin d’implémenter chaque propriété dans la spécification. Toutefois, vous devez prendre en charge les propriétés requises ; consultez la spécification de conformité de niveau 0 pour plus d’informations. Si vous ne souhaitez pas prendre en charge une propriété, vous pouvez la supprimer de la carte. Si vous souhaitez prendre en charge une propriété, ajoutez-la dans la carte à l’aide d’une macro PROPERTY_INFO_ENTRY. La macro correspond à la UPROPINFO structure, comme indiqué dans le code suivant :

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

Chaque élément de la structure représente des informations pour gérer la propriété. Il contient un DBPROPID élément permettant de déterminer le GUID et l’ID de la propriété. Il contient également des entrées pour déterminer le type et la valeur de la propriété.

Si vous souhaitez modifier la valeur par défaut d’une propriété (notez qu’un consommateur peut modifier la valeur d’une propriété accessible en écriture à tout moment), vous pouvez utiliser la macro PROPERTY_INFO_ENTRY_VALUE ou PROPERTY_INFO_ENTRY_EX. Ces macros vous permettent de spécifier une valeur pour une propriété correspondante. La macro PROPERTY_INFO_ENTRY_VALUE est une notation abrégée qui vous permet de modifier la valeur. La macro PROPERTY_INFO_ENTRY_VALUE appelle la macro PROPERTY_INFO_ENTRY_EX. Cette macro vous permet d’ajouter ou de modifier tous les attributs de la UPROPINFO structure.

Si vous souhaitez définir votre propre jeu de propriétés, vous pouvez en ajouter un en créant une combinaison BEGIN_PROPSET_MAP/END_PROPSET_MAP supplémentaire. Définissez un GUID pour le jeu de propriétés, puis définissez vos propres propriétés. Si vous avez des propriétés spécifiques au fournisseur, ajoutez-les à un nouveau jeu de propriétés plutôt qu’à l’aide d’une propriété existante. Cela évite les problèmes dans les versions ultérieures d’OLE DB.

Ensembles de propriétés définis par l’utilisateur

Visual C++ prend en charge les jeux de propriétés définis par l’utilisateur. Vous n’avez pas besoin de remplacer GetProperties ou GetPropertyInfo. Au lieu de cela, les modèles détectent tout jeu de propriétés défini par l’utilisateur et l’ajoutent à l’objet approprié.

Si vous avez un jeu de propriétés défini par l’utilisateur qui doit être disponible au moment de l’initialisation (autrement dit, avant les appels IDBInitialize::Initializedu consommateur), vous pouvez le spécifier à l’aide de l’indicateur de UPROPSET_USERINIT avec la macro BEGIN_PROPERTY_SET_EX. Le jeu de propriétés doit se trouver dans l’objet source de données pour que cela fonctionne (car la spécification OLE DB nécessite). Par exemple :

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

Voir aussi

Fichiers générés par l’Assistant Fournisseur