Compartir a través de


CCustomSource (CustomDS.h)

Las clases de proveedor usan una herencia múltiple. El código siguiente muestra la cadena de herencia del objeto de origen de datos:

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

Todos los componentes de COM se derivan de CComObjectRootEx y CComCoClass. CComObjectRootEx proporciona una implementación de la interfaz IUnknown. Puede controlar cualquier modelo de subprocesos. CComCoClass controla cualquier compatibilidad con errores necesaria. Si desea enviar al cliente información más completa sobre los errores, puede usar algunas de las API de error en CComCoClass.

El objeto de origen de datos también se hereda de varias clases "Impl". Cada clase proporciona la implementación de una interfaz. El objeto de origen de datos implementa las interfaces IPersist, IDBProperties, IDBInitialize y IDBCreateSession. OLE DB requiere todas las interfaces para implementar el objeto de origen de datos. Puede optar por admitir, o no, una funcionalidad determinada heredando, o no, una de estas clases "Impl". Si desea admitir la interfaz IDBDataSourceAdmin, herede de la clase IDBDataSourceAdminImpl para obtener la funcionalidad necesaria.

Asignación de COM

Cada vez que el cliente llama a QueryInterface para una interfaz en el origen de datos, pasa por la siguiente asignación de 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()

Las macros de COM_INTERFACE_ENTRY proceden de ATL e indican a la implementación de QueryInterface en CComObjectRootEx que devuelva las interfaces adecuadas.

Asignación de propiedades

La asignación de propiedades especifica todas las propiedades que ha asignado el proveedor:

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

Las propiedades de OLE DB se agrupan. El objeto de origen de datos tiene dos grupos de propiedades: uno para el conjunto de DBPROPSET_DATASOURCEINFO y otro para el conjunto de DBPROPSET_DBINIT. El conjunto de DBPROPSET_DATASOURCEINFO corresponde a propiedades del proveedor y su origen de datos. El conjunto de DBPROPSET_DBINIT corresponde a las propiedades usadas en la inicialización. Las plantillas de proveedor OLE DB controlan estos conjuntos con las macros de PROPERTY_SET. Las macros crean un bloque que contiene una matriz de propiedades. Cada vez que el cliente llama a la interfaz de IDBProperties, el proveedor usa la asignación de propiedades.

No hace falta implementar todas las propiedades en la especificación. Sin embargo, es preciso admitir las propiedades necesarias; para más información, consulte la especificación de conformidad de nivel 0. Si no desea admitir una propiedad, puede quitarla de la asignación. Si desea admitir una propiedad, utilice una macro PROPERTY_INFO_ENTRY para agregarla a la asignación. La macro corresponde a la estructura UPROPINFO, como se muestra en el código siguiente:

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

Cada elemento de la estructura representa información para controlar la propiedad. Contiene un elemento DBPROPID para determinar tanto el GUID como el identificador de la propiedad. También contiene entradas para determinar el tipo y el valor de la propiedad.

Si desea cambiar el valor predeterminado de una propiedad (tenga en cuenta que un consumidor puede cambiar el valor de una propiedad grabable en cualquier momento), puede usar las macros PROPERTY_INFO_ENTRY_VALUE o PROPERTY_INFO_ENTRY_EX. Estas macros permiten especificar un valor para una propiedad correspondiente. La macro PROPERTY_INFO_ENTRY_VALUE es una notación abreviada que permite cambiar el valor. La macro PROPERTY_INFO_ENTRY_VALUE llama a la macro PROPERTY_INFO_ENTRY_EX. Esta macro permite agregar o cambiar todos los atributos de la estructura UPROPINFO.

Si desea definir su propio conjunto de propiedades, puede agregar uno creando una combinación BEGIN_PROPSET_MAP/END_PROPSET_MAP adicional. Defina un GUID para el conjunto de propiedades y, después, defina sus propias propiedades. Si tiene propiedades específicas del proveedor, agréguelas a un nuevo conjunto de propiedades, en lugar de usar uno. Esto evita problemas en versiones posteriores de OLE DB.

Conjuntos de propiedades definidas por el usuario

Visual C++ admite conjuntos de propiedades definidos por el usuario. No tiene que invalidar GetProperties ni GetPropertyInfo. En su lugar, las plantillas detectan cualquier conjunto de propiedades definido por el usuario y lo agregan al objeto adecuado.

Si tiene un conjunto de propiedades definido por el usuario que debe estar disponible en el momento de la inicialización (es decir, antes de que el consumidor llame a IDBInitialize::Initialize), puede especificarlo mediante la marca UPROPSET_USERINIT, junto con la macro BEGIN_PROPERTY_SET_EX. Para que todo esto funcione, el conjunto de propiedades debe estar en el objeto de origen de datos (como requiere la especificación de OLE DB). Por ejemplo:

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

Consulte también

Archivos generados por el Asistente para proveedores