CCustomSource (CustomDS.h)
As classes de provedor usam várias heranças. O seguinte código mostra a cadeia de herança do objeto de fonte de dados:
/////////////////////////////////////////////////////////////////////////
// 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 os componentes COM derivam de CComObjectRootEx
e CComCoClass
. CComObjectRootEx
fornece a implementação para a interface IUnknown
. Ele pode lidar com qualquer modelo de threading. CComCoClass
manipula qualquer suporte de erro necessário. Se você quiser enviar informações de erro mais avançadas para o cliente, poderá usar algumas das APIs de erro em CComCoClass
.
O objeto de fonte de dados também herda de várias classes 'Impl'. Cada classe fornece a implementação de uma interface. O objeto de fonte de dados implementa as interfaces IPersist
, IDBProperties
, IDBInitialize
e IDBCreateSession
. Cada interface é exigida pelo OLE DB para implementar o objeto de fonte de dados. Você pode optar por dar suporte ou não a uma funcionalidade específica herdando ou não herdando de uma dessas classes 'Impl'. Se você quiser dar suporte à interface IDBDataSourceAdmin
, deverá herdar da classe IDBDataSourceAdminImpl
para obter a funcionalidade necessária.
Mapa COM
Sempre que o cliente chama QueryInterface
para uma interface na fonte de dados, ele passa pelo seguinte mapa 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()
As macros COM_INTERFACE_ENTRY são da ATL e informam à implementação de QueryInterface
em CComObjectRootEx
para retornar as interfaces apropriadas.
Mapa de propriedades
O mapa de propriedades especifica todas as propriedades atribuídas pelo provedor:
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()
As propriedades no OLE DB são agrupadas. O objeto de fonte de dados tem dois grupos de propriedades: um para o conjunto DBPROPSET_DATASOURCEINFO e outro para o conjunto DBPROPSET_DBINIT. O conjunto de DBPROPSET_DATASOURCEINFO corresponde às propriedades sobre o provedor e a respectiva fonte de dados. O conjunto de DBPROPSET_DBINIT corresponde às propriedades usadas na inicialização. Os Modelos de Provedor OLE DB lidam com esses conjuntos com as macros PROPERTY_SET. As macros criam um bloco que contém uma matriz de propriedades. Sempre que o cliente chama a interface IDBProperties
, o provedor usa o mapa de propriedades.
Você não precisa implementar todas as propriedades na especificação. No entanto, você precisa dar suporte às propriedades necessárias; confira a especificação de conformidade do nível 0 para obter mais informações. Se você não quiser dar suporte a uma propriedade, poderá removê-la do mapa. Se você quiser dar suporte a uma propriedade, adicione-a ao mapa usando uma macro PROPERTY_INFO_ENTRY. A macro corresponde à estrutura UPROPINFO
, conforme mostrado no seguinte código:
struct UPROPINFO
{
DBPROPID dwPropId;
ULONG ulIDS;
VARTYPE VarType;
DBPROPFLAGS dwFlags;
union
{
DWORD dwVal;
LPOLESTR szVal;
};
DBPROPOPTIONS dwOption;
};
Cada elemento na estrutura representa informações para manipular a propriedade. Ele contém um DBPROPID
para determinar o GUID e a ID da propriedade. Ele também contém entradas para determinar o tipo e o valor da propriedade.
Se você quiser alterar o valor padrão de uma propriedade (observe que um consumidor pode alterar o valor de uma propriedade gravável a qualquer momento), você pode usar a macro PROPERTY_INFO_ENTRY_VALUE ou PROPERTY_INFO_ENTRY_EX. Essas macros permitem que você especifique um valor para uma propriedade correspondente. A macro PROPERTY_INFO_ENTRY_VALUE é uma notação abreviada que permite alterar o valor. A macro PROPERTY_INFO_ENTRY_VALUE chama a macro PROPERTY_INFO_ENTRY_EX. Essa macro permite que você adicione ou altere todos os atributos na estrutura UPROPINFO
.
Se você quiser definir seu conjunto de propriedades, poderá adicionar um fazendo uma combinação de BEGIN_PROPSET_MAP/END_PROPSET_MAP adicional. Defina um GUID para o conjunto de propriedades e defina suas propriedades. Se você tiver propriedades específicas a um provedor, adicione-as a um novo conjunto de propriedades em vez de usar um existente. Isso evita problemas em versões posteriores do OLE DB.
Conjuntos de propriedades definidos pelo usuário
O Visual C++ dá suporte a conjuntos de propriedades definidos pelo usuário. Você não precisa substituir GetProperties
nem GetPropertyInfo
. Em vez disso, os modelos detectam qualquer conjunto de propriedades definido pelo usuário e o adicionam ao objeto apropriado.
Se você tiver um conjunto de propriedades definido pelo usuário que precise estar disponível no momento da inicialização (ou seja, antes de o consumidor chamar IDBInitialize::Initialize
), você poderá especificar isso usando o sinalizador UPROPSET_USERINIT junto com a macro BEGIN_PROPERTY_SET_EX. O conjunto de propriedades precisa estar no objeto de fonte de dados para que isso funcione (como a especificação do OLE DB exige). Por exemplo:
BEGIN_PROPERTY_SET_EX(DBPROPSET_MYPROPSET, UPROPSET_USERINIT)
PROPERTY_INFO_ENTRY(DBPROP_MYPROP)
END_PROPERTY_SET_EX(DBPROPSET_MYPROPSET)