Поделиться через


CCustomSource (CustomDS.h)

Классы поставщиков используют несколько наследования. В следующем коде показана цепочка наследования для объекта источника данных:

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

Все компоненты COM являются производными от CComObjectRootEx и CComCoClass. CComObjectRootEx предоставляет всю реализацию интерфейса IUnknown . Он может обрабатывать любую модель потоков. CComCoClass обрабатывает необходимую поддержку ошибок. Если вы хотите отправить более подробные сведения об ошибке клиенту, можно использовать некоторые API ошибок в CComCoClass.

Объект источника данных также наследует от нескольких классов Impl. Каждый класс предоставляет реализацию для интерфейса. Объект источника данных реализует IPersistинтерфейсы , IDBPropertiesIDBInitializeа также IDBCreateSession интерфейсы. Каждый интерфейс требуется OLE DB для реализации объекта источника данных. Вы можете выбрать поддержку или не поддерживать определенные функции, наследуя или не наследуя от одного из этих классов Impl. Если вы хотите поддерживать IDBDataSourceAdmin интерфейс, вы наследуете от IDBDataSourceAdminImpl класса, чтобы получить необходимые функции.

Карта COM

Каждый раз, когда клиент обращается QueryInterface к интерфейсу в источнике данных, он проходит по следующей 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()

Макросы COM_INTERFACE_ENTRY из ATL и сообщают реализации QueryInterface CComObjectRootEx , чтобы вернуть соответствующие интерфейсы.

Карта свойств

Карта свойств указывает все свойства, назначенные поставщиком:

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

Свойства в OLE DB группируются. Объект источника данных имеет две группы свойств: один для набора DBPROPSET_DATASOURCEINFO и один для набора DBPROPSET_DBINIT. Набор DBPROPSET_DATASOURCEINFO соответствует свойствам поставщика и его источнику данных. Набор DBPROPSET_DBINIT соответствует свойствам, используемым при инициализации. Шаблоны поставщиков OLE DB обрабатывают эти наборы с помощью макросов PROPERTY_SET. Макросы создают блок, содержащий массив свойств. Всякий раз, когда клиент вызывает IDBProperties интерфейс, поставщик использует карту свойств.

Вам не нужно реализовывать каждое свойство в спецификации. Однако необходимо поддерживать необходимые свойства; Дополнительные сведения см. в спецификации соответствия уровня 0. Если вы не хотите поддерживать свойство, его можно удалить из карты. Если вы хотите поддерживать свойство, добавьте его в карту с помощью макроса PROPERTY_INFO_ENTRY. Макрос соответствует UPROPINFO структуре, как показано в следующем коде:

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

Каждый элемент в структуре представляет сведения для обработки свойства. Он содержит DBPROPID идентификатор guid и идентификатор свойства. Он также содержит записи для определения типа и значения свойства.

Если вы хотите изменить значение свойства по умолчанию (обратите внимание, что потребитель может изменить значение записываемого свойства в любое время), можно использовать макрос PROPERTY_INFO_ENTRY_VALUE или PROPERTY_INFO_ENTRY_EX. Эти макросы позволяют указать значение соответствующего свойства. Макрос PROPERTY_INFO_ENTRY_VALUE — это сокращенная нотация, которая позволяет изменить значение. Макрос PROPERTY_INFO_ENTRY_VALUE вызывает макрос PROPERTY_INFO_ENTRY_EX. Этот макрос позволяет добавлять или изменять все атрибуты в UPROPINFO структуре.

Если вы хотите определить собственный набор свойств, можно добавить его, выполнив дополнительное сочетание BEGIN_PROPSET_MAP/END_PROPSET_MAP. Определите GUID для набора свойств и определите собственные свойства. Если у вас есть свойства, относящиеся к поставщику, добавьте их в новый набор свойств вместо использования существующего. Это позволяет избежать проблем в более поздних версиях OLE DB.

Определяемые пользователем наборы свойств

Visual C++ поддерживает определяемые пользователем наборы свойств. Вам не нужно переопределять GetProperties или GetPropertyInfo. Вместо этого шаблоны обнаруживают любой определяемый пользователем набор свойств и добавляют его в соответствующий объект.

Если у вас есть определяемый пользователем набор свойств, который должен быть доступен во время инициализации (то есть перед вызовами IDBInitialize::Initializeпотребителей), этот параметр можно указать с помощью флага UPROPSET_USERINIT вместе с макросом BEGIN_PROPERTY_SET_EX. Набор свойств должен находиться в объекте источника данных для работы (как требуется спецификация OLE DB). Например:

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

См. также

Созданные мастером поставщика файлы