Продолжается подписка на наши издания! Вы не забыли подписаться?

OLE DB: правильный выбор интерфейса

OLE DB определяет полный набор интерфейсов доступа к широкому спектру типов данных, содержащихся в различных хранилищах. OLE DB Programmer's Reference может испугать своим объемом, но ни одно из хранилищ данных не может обеспечить поддержку всего набора возможностей, описанных в этом справочнике. OLE DB-провайдеры данных всего лишь предоставляют интерфейсы, отражающие исходные свойства и возможности хранилищ данных. Базовый уровень функциональности поддерживается всеми провайдерами. Взаимодействие над этим базовым уровнем посредством реализаций общих дополнений — таких, как прокрутка (scrolling) или позиционирование, базирующееся на утверждении — обеспечивают общие обслуживающие компоненты, если провайдер не предоставляет такой поддержки.

Под минимальным уровнем поддержки, предоставляемым всеми хранилищами данных с общим набором дополнительных сервисов понимается:

Введение: OLE DB как компонентно-ориентированная технология

Чтобы предоставить доступ к данным всех типов в среде СОМ (Component Object Model — Объектно-компонентная модель), OLE DB спроектирована как компонентно-ориентированная технология. В OLE DB хранилища данных предоставляют интерфейсы, отражающие их изначальный набор возможностей. На основе этих интерфейсов для обеспечения более устойчивых моделей данных могут строиться общие компоненты. Компонентную архитектуру можно определить так: OLE DB определяет общие характеристики различных провайдеров данных и сервисов, а также определяет общие интерфейсы, которые отражали бы эти характеристики. Например, хотя набор строк (rowset) и может быть получен при помощи множества различных механизмов, результатом всегда будет набор строк с точно определенными интерфейсами, методами и характеристиками. Работа OLE DB с результатами составной таблицы не отличается от работы с результирующим текстовым файлом, содержащим табличные данные. Такое определение общих интерфейсов позволяет компонентам более эффективно расширять индивидуальную функциональность провайдера данных.

После определения базового набора возможностей всю дополнительную функциональность следует рассматривать как дополнения к базовой. Таким образом, более сложные провайдеры могут предоставлять свои расширенные возможности в дополнение к интерфейсам базового уровня. Более того, отдельные обслуживающие компоненты могут реализовывать эти возможности, строясь на базе более простых провайдеров.

Потребители

Разработчики, пишущие приложения для работы с OLE DB, могут выбирать их уровень взаимодействия с провайдерами OLE DB. Такие приложения-потребители могут создаваться для использования определенного провайдера, причем в этом случае они проектируются с учетом функциональности конкретного провайдера. Либо, они могут создаваться для использования общих провайдеров. Работая с общим провайдером, потребитель может сделать следующее:

Таблица 1. Базовые интерфейсы потребителя

Object

Base interfaces

Updatable

Root Enumerator

IDBInitialize

 
 

IParseDisplayName1

 
 

ISourcesRowset1

 

Data Links

IDataInitialize1

 
 

IPromptInitialize1

 

RowPosition

IRowPosition1

 

DataSource

IDBCreateSession

 
 

IDBInitialize

 
 

IDBProperties

 
 

IPersist

 

Session

IGetDataSource

 
 

IOpenRowset

 
 

ISessionProperties

 

Rowset

IAccessor

IRowsetChange

 

IColumnsInfo

 
 

IConvertType

 
 

IRowset

 
 

IRowsetFind

 
 

IRowsetIdentity

 
 

IRowsetInfo

 
 

IRowsetLocate

 
 

IRowsetScroll

 

Rowset Behavior

DBPROP_ CANHOLDROWS

DBPROP_ REMOVEDELETED

 

DBPROP_ CANFETCHBACKWARDS

DBPROP_ OWNUPDATEDELETE

 

DBPROP_ CANSCROLLBACKWARDS

DBPROP_ OWNINSERT

  DBPROP_ CANFETCHBACKWARDS DBPROP_ OWNUPDATEDELETE
  DBPROP_ CANSCROLLBACKWARDS DBPROP_ OWNINSERT

1.Эти интерфейсы всегда поддерживаются общими компонентами SDK. Непосредственно провайдерами они не реализуются никогда.

Функциональность базового потребителя

В таблице 1 приведен минимальный набор средств, на поддержку которого потребитель может рассчитывать при взаимодействии с любым OLE DB-провайдером. Эта таблица разбита на три столбца:

Потребитель гарантированно получит описанные выше возможности одним способом из трех:

Провайдеры

OLE DB-провайдеры предоставляют интерфейсы OLE DB для некоторых типов данных. Провайдеры OLE DB включают в текстовый файл или поток данных все из полной SQL-СУБД. Очевидно, что эти провайдеры данных обладают различной функциональностью, и важно эту функциональность не ограничивать. Но, в то же время, нецелесообразно ожидать от всех провайдеров, предлагающих простые табличные данные , реализации полнофункционального сервера запросов.

Провайдеры поддерживают исходные свойства предоставляемых ими данных. Как минимум, сюда входят возможности, , описанные в разделе "Минимальная функциональность провайдера". Дополнительные интерфейсы должны реализовываться как не противоречащие изначальным. Если изначально провайдер поддерживает всё, что перечислено в разделе "Функциональность базового потребителя", то обслуживающим компонентам не обязательно обеспечивать минимальный набор возможностей потребителя. В дополнение, провайдеры могут предоставлять интерфейсы для дополнительных возможностей , описанных в разделе "Расширенные интерфейсы".

Все провайдеры должны быть многофункциональными (apartment), временными (rental) или многопоточными (multithread), и должны поддерживать аггрегации объектов DataSource, Session и Rowset. При возможно, провайдеры должны поддерживать агрегации объектов Command и View.

Провайдеры должны поддерживать преобразование данных в типы, возвращаемые в IColumnsInfo::GetColumnsInfo или IColumnsRowset::GetColumnsRowset для столбцов rowset, и в ICommandWithParameters::GetParameterInfo для параметров, а также DBTYPE_WSTR для всех значений столбцов или параметров, отличающихся от тех, которые описаны как объекты. Провайдеры, поддерживающие привязку к объектам типа IStream или ILockBytes , должны поддерживать и привязку к их столбцам как ISequentialStreams.

Таблица 2. Интерфейсы провайдера с минимальной функциональностью

Object

Any OLE DB provider

Updatable providers

DataSource

IDBCreateSession

 
 

IDBInitialize

 
 

IDBProperties

 
 

Ipersist

 

Session

IgetDataSource

 
 

IopenRowset

 
 

IsessionProperties

 

Rowset

Iaccessor

IConnectionPointContainer for IRowsetNotify1

 

IconvertType

IRowsetChange

 

IcolumnsInfo

 
 

Irowset

 
 

IrowsetIdentity

 
 

IrowsetInfo

 

Rowset Behavior

DBPROP_CANHOLDROWS

DBPROP_ OWNUPDATEDELETE

   

DBPROP_OWNINSERT

   

DBPROP_ REMOVEDELETED

1. Для соответствия минимальным требованиям, предъявляемым провайдеру с возможностью обновления, для провайдеров OLE DB 2.0 поддержка IConnectionPointContainer для IRowsetNotify необязательна. Однако, обновляемые провайдеры обязательно должны поддерживать эту точку подключения, поскольку некоторые потребители будут вынуждены расценивать провайдеров, не поддерживающих нотификацию rowset выставлением точки подключения для IRowSetNotify, как провайдеров только для чтения.
Поддержка интерфейса означает поддержку всех методов этого интерфейса. При отсутствии методов возвращается E_NOTIMPL.
Поддержка свойства означает поддержку установок и соответствующего поведения всех возможных значений этого свойства.
Поддержка необходимых свойств rowset означает, что при указании любой комбинации свойств rowset результатом будет rowset, имеющий по меньшей мере эти свойства. Это не значит, что данные свойства всегда справедливы для любого rowset, если свойства не запрашивались пользователем.

Таблица 3. Полный набор интерфейсов базового провайдера

Object

Any base provider

Updatable providers

Rowset IrowsetFind  
  IrowsetLocate  
  IrowsetScroll  
Rowset Behavior DBPROP_ CANSCROLLBACKWARDS1  
  DBPROP_ CANFETCHBACKWARDS1  

1 Провайдер, поддерживающий свойство DBPROP_CANSCROLLBACKWARDS, должен поддерживать и свойство DBPROP_CANFETCHBACKWARDS.

Минимальная функциональность провайдера

Важно, чтобы при создании провайдера был реализован полный набор интерфейсов, относящийся к определенному типу данных. Для того, чтобы провайдер рассматривался как общий OLE DB-провайдер, он должен реализовывать, как минимум, интерфейсы и поведение, приведенные в Таблице 2. Провайдеры, реализующие минимальную функциональность, для реализации базовой функциональности потребителя (рис.1), могут рассчитывать на общие обслуживающие компоненты SDK.

oledb1.GIF (2976 bytes)

Рис. 1. Базовое приложение для общения с провайдером с минимальной функциональностью использует сервисные компоненты.

Базовые провайдеры

Провайдеры, реализующие полный набор базовых интерфейсов, могут использоваться общими потребителями без поддержки дополнительных обслуживающих компонентов, что показано на Рис. 2.

oledb2.GIF (2091 bytes)

Рис. 2. Базовое приложение общается с базовым провайдером напрямую

Провайдеры, реализующие возможности, приведенные в таблице 3, в дополнение к минимальной функциональности провайдера, используются как базовые провайдеры.

Таблица 4. Расширенные интерфейсы

Object Any provider Updatable providers Transacted providers
DataSource IConnectionPointContainer for IDBAsynchNotify    
  IDBAsynchStatus    
  IDataSourceAdmin    
  IDBInfo2    
  IPersistFile    
  ISupportErrorInfo    
Session IAlterIndex   ITransactionLocal
  IAlterTable   ITransactionJoin
  IDBSchemaRowset   ITransactionObject
  IDBView1    
  IDBCreateCommand2    
  IIndexDefinition    
  ITableDefinition    
  ISupportErrorInfo    
View1 IViewFilter    
  IViewSort    
  IColumnsInfo    
  IAccessor    
  ISupportErrorInfo    
  IViewRowset    
  IViewChapter    
Command2 IAccessor    
  ICommand    
  ICommandPersist    
  ICommandText    
  IColumnsInfo    
  ICommandPrepare    
  IColumnsRowset    
  ICommandProperties    
  ICommandWithParameters    
  IConvertType    
  ISupportErrorInfo    
Command Behavior MAXTABLESINSELECT>1    
Custom Error ISQLErrorInfo    
Multiple Results IMultipleResults    
Rowset IConnectionPointContainer for

-IRowsetNotify

-IDBAsynchNotify

IRowsetResynch  
  IColumnsRowset    
  IChapteredRowset1    
  IDBAsynchStatus IRowsetUpdate  
  IRowsetChapterMember    
  IRowsetIdentity    
  IRowsetLocate    
  IRowsetView1    
  IRowsetIndex3    
  IRowsetIndex3    
  ISupportErrorInfo    
Rowset Behavior DBPROP_ LITERALBOOKMARKS DBPROP_CHANGE INSERTEDROWS DBPROP_ COMMITPRESERVE
  DBPROP_ ORDEREDBOOKMARKS DBPROP_RETURN PENDINGROWS DBPROP_ ABORTPRESERVE
  DBPROP_ LITERALIDENTITY DBPROP_ IMMOBILEROWS  
  DBPROP_ BOOKMARKSKIPPED    
  DBPROP_OTHERINSERT    
  DBPROP_ OTHERUPDATEDELETE    
  DBPROP_ STRONGIDENTITY    
BLOB Support DBPROP_OLEOBJECTS    
  DBPROP_MULTIPLE STORAGEOBJECTS    
  DBPROP_STRUCTURED STORAGE    
  ISequentialStream    
  IStream    
  IStorage    
  ILockBytes    
  DBPROP_BLOCKING STORAGEOBJECTS=FALSE    

1. Расширенная функциональность, которая может предоставляться провайдерами, поддерживающими работу с rowset.

2. Расширенная функциональность, которая может предоставляться провайдерами, поддерживающими команды.

3. Расширенная функциональность, которая может предоставляться провайдерами, поддерживающими поиск по индексу.

Расширенные интерфейсы

Провайдеры общего назначения могут обладать дополнительными возможностями . Преимущество состоит в том, что, эти провайдеры поддерживают столько дополнительных интерфейсов, сколько связано с определенным типом данных .

Помимо дополнительных интерфейсов, провайдеры могут поддерживать и определенные интерфейсы для::

Общие потребители должны создаваться для провайдеров, не поддерживающих расширенные интерфейсы. Потребители могут работать с такими провайдерами несколькими различными способами:


Copyright © 1994-2016 ООО "К-Пресс"