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 IPersist
interfacesIDBProperties
IDBInitialize
IDBCreateSession
. 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::Initialize
du 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)