|
||||||||
|
|
Введение в базы данныхЧасть 5. Механизмы доступа к данным. OLE DB и ADOАлексей Федоров, Наталия Елманова Microsoft Universal Data Access Microsoft ActiveX Data Objects ADO Extensions for Data Definition and Security (ADOX) ADO Multi-Dimensional Extensions (ADOMD)
В предыдущей статье данного цикла, опубликованной в © 6'2000, мы обсудили различные механизмы доступа к данным и подробно рассмотрели библиотеку Borland Database Engine (BDE), архитектуру использующих ее приложений, а также выяснили, с помощью каких продуктов третьих фирм можно заменить BDE в средствах разработки фирмы Borland. Как мы уже говорили, применение BDE нередко связано с определенными ограничениями, причина которых - отсутствие необходимых BDE-драйверов. В настоящей статье мы рассмотрим другой универсальный механизм доступа к данным - Microsoft ADO (ActiveX Data Objects), ныне широко применяемый не только в средствах разработки фирм Microsoft и Borland, но и во многих <пользовательских> продуктах, таких как Microsoft Office, Microsoft Internet Explorer, в ASP-приложениях и др. ADO становится все более и более популярным способом доступа к данным, так как не только входит в состав Microsoft Office 2000 и Microsoft Internet Explorer 5.0, но и является частью ядра операционных систем семейства Windows 2000. В предыдущей статье цикла мы упоминали, что OLE DB и ADO, являясь частью универсального механизма доступа к данным фирмы Microsoft (Microsoft Universal Data Access), позволяют осуществить доступ как к реляционным, так и к нереляционным источникам данных, таким как файловая система, данные электронной почты, многомерные хранилища данных и др. Эту статью мы хотим целиком посвятить универсальному механизму доступа к данным фирмы Microsoft. Microsoft Universal Data AccessУниверсальный механизм доступа к данным (Universal Data Access) являет собой стратегию предоставления доступа к любому типу информации предприятия. Он обеспечивает высокопроизводительный доступ к различным источникам информации (включая реляционные и нереляционные данные), в том числе к данным, хранящимся на мэйнфреймах, данным электронной почты и файловой системы, текстовым, графическим и географическим данным и др. Для многих современных приложений, использующих данные, характерно подобное разнообразие их источников. Более того, вполне очевидно, что могут появляться новые форматы данных и способы их хранения, поэтому разумным требованием к универсальному механизму доступа к данным была бы возможность поддержки не только существующих в настоящее время форматов и источников данных, но и форматов данных, которые будут созданы в будущем. Назначение универсального механизма доступа к данным фирмы Microsoft - предоставить доступ к перечисленным источникам данных с помощью единой модели доступа к данным. В настоящее время универсальный механизм доступа к данным фирмы Microsoft поддерживает все наиболее популярные настольные и серверные СУБД, о которых мы писали в предыдущих статьях данного цикла. Далее мы рассмотрим основные компоненты архитектуры универсального механизма доступа к данным Microsoft и обсудим их более детально:
Архитектура универсального механизма доступа к данным Microsoft схематически представлена на рис. 1. Рис. 1 Так как OLE DB является низкоуровневым интерфейсом доступа к данным, мы начнем рассмотрение составных частей универсального механизма доступа к данным фирмы Microsoft именно с него. Ниже мы обсудим архитектуру и интерфейсы OLE DB, а затем покажем, как OLE DB взаимодействует с ADO. OLE DBИтак, OLE DB представляет собой программный интерфейс для доступа к различным источникам данных, таким как реляционные и нереляционные данные, текстовые, графические и географические данные, архивы электронных писем, файловая система, бизнес-объекты. В спецификации OLE DB определен набор COM-интерфейсов (COM, Component Object Model, компонентная модель объектов Microsoft, являющаяся составной частью 32-разрядных версий Windows), инкапсулирующих различные сервисы управления данными и предоставляющих однотипный доступ к перечисленным выше данным. Эти интерфейсы могут быть использованы в приложениях, предоставляющих доступ к данным. Компоненты OLE DBНа самом верхнем уровне можно отметить три главных компонента OLE DB: потребители (consumers), провайдеры данных (data providers) и сервисные компоненты (service components). Любой компонент программного обеспечения, применяющий интерфейсы OLE DB, является потребителем. Это может быть какое-либо офисное приложение или иное бизнес-приложение, средство разработки типа Visual Basic или Delphi либо даже COM-объекты для доступа к данным, применяющие интерфейсы OLE DB. Потребители могут обращаться к данным посредством ActiveX Data Objects, представляющих собой высокоуровневый интерфейс к OLE DB, или применять OLE DB непосредственно, используя OLE DB-провайдер. Провайдер - это часть программного обеспечения, в которой реализованы интерфейсы OLE DB. С точки зрения OLE DB существуют два типа OLE DB-провайдеров - провайдеры данных и сервисные компоненты. Провайдер данных - это компонент программного обеспечения, манипулирующий данными. Он располагается между потребителем данных и базой данных. В OLE DB все провайдеры представляют данные в табличном формате (аналогичном тому, в котором хранятся данные в реляционных СУБД и файлах электронных таблиц), в виде виртуальных таблиц. Провайдер данных выполняет следующие функции:
Примером провайдеров данных является провайдер Microsoft Jet 4.0 OLE DB Provider, который используется для доступа к данным Microsoft Access, а также к данным I-ISAM (Installable Indexed Sequential Access Method), файлам рабочих книг Excel, хранилищ данных Microsoft Outlook и Microsoft Exchange, таблиц dBase и Paradox, текстовым файлам, файлам в формате HTML и др. Еще один пример OLE DB-провайдера - Microsoft OLE DB Provider for SQL Server, применяемый для доступа к базам данных Microsoft SQL Server 6.5 и 7.0. Провайдер сервисов (или сервисный компонент) реализует расширенную функциональность, не поддерживаемую обычными провайдерами данных, например сортировку и фильтрацию данных, обработку транзакций и SQL-запросов, управление курсором и др. Сервисный компонент может обращаться к хранилищу данных непосредственно или с помощью соответствующего провайдера данных - в этом случае провайдер сервисов является одновременно и провайдером, и потребителем. Например, сервисные компоненты, такие как Microsoft Cursor Service for OLE DB и Microsoft Data Shaping Service for OLE DB, могут использоваться совместно с провайдерами данных OLE DB для расширения их функциональности. На рис. 2 показано, как компоненты OLE DB взаимодействуют между собой. Из рисунка следует, что потребитель может получать данные как непосредственно с помощью провайдера данных, так и с использованием сервисов, предоставляемых сервисными компонентами. Рис. 2 В табл. 1 приведен список провайдеров, доступных в составе набора MDAC (Microsoft Data Access Components), поставляемого с рядом продуктов Microsoft. Таблица 1
Как мы уже писали, OLE DB представляет собой набор COM-интерфейсов. На рис. 3 схематически представлены четыре основных объекта и их интерфейсы, а также методы, с помощью которых они взаимодействуют. Рис. 3 Отметим, что каждый OLE DB-провайдер должен содержать реализацию объектов DataSource, Session и Rowset. Помимо трех основных объектов могут быть и другие. Рассмотрим эти объекты более подробно. Объекты OLE DBОбъектная модель OLE DB содержит четыре ключевых объекта:
Объект DataSourceОбъект DataSource, применяемый потребителями данных для соединения с провайдером, может быть создан различными способами, включая вызов функции CoCreateInstance с идентификатором класса (CLSID, Class Identifier) OLE DB-провайдера, использование объекта Enumerator (см. ниже), который занимается поиском источников данных, и пр. Объект DataSource инкапсулирует информацию, связанную с соединением (включая имя пользователя и пароль). Основное назначение этого объекта - предоставлять данные из источника данных потребителю. Для создания новой сессии (объект Session) потребитель должен вызвать метод CreateSession интерфейса IDBCreateSession объекта DataSource. Объект SessionОбъект Session предоставляет контекст для транзакций, может генерировать наборы данных (rowsets) из источников данных, а также команды для запросов к источнику данных. Объект Session может выполнять роль фабрики классов для объектов Command и Rowset (см. ниже) и объекта Transaction, применяемого для управления вложенными транзакциями. Объекты Command и Rowset могут быть использованы для создания или модификации таблиц и индексов. Интерфейс IOpenRowset используется потребителями данных для работы с отдельными таблицами и индексами в хранилище данных. С одним объектом DataSource может быть связано несколько объектов Session. Если OLE DB-провайдер поддерживает команды или запросы, он должен уметь порождать объект Command. С одним объектом DataSource может быть связано несколько объектов Command. Для создания нового объекта Command применяется метод CreateCommand интерфейса IDBCreateCommand. Объект CommandОбъект Command используется для выполнения команд, представляющих собой строки, передаваемые от потребителя данных объекту Data Source для выполнения. В большинстве случаев такая команда представляет собой SQL-предложение SELECT, однако в общем случае это может быть любое другое SQL-предложение (например, DDL-предложение). Команды могут содержать параметры - в этом случае применяется интерфейс ICommandWithParameters. Одна сессия может порождать несколько команд. Результатом выполнения команды (с помощью метода Execute интерфейса ICommand) обычно является новый объект Rowset. Объект RowsetОбъект Rowset (набор данных) позволяет OLE DB-провайдеру данных представлять данные из источников данных в табличном формате, то есть в виде набора строк, содержащих одну или несколько колонок. Этот объект может быть результатом выполнения команды или может быть сгенерирован непосредственно провайдером данных, если провайдер не поддерживает команд. Все провайдеры данных <умеют> создавать наборы данных напрямую. Объект Rowset может быть также использован для обновления, добавления или удаления строк - это зависит от функциональности провайдера данных. С помощью интерфейса IRowset из объекта Rowset потребители могут перемещаться по набору данных вперед и, если набор данных позволяет, назад. Некоторые провайдеры могут предоставлять дополнительные функции наподобие непосредственного доступа или определения примерной позиции данной строки в наборе. Частным случаем объекта Rowset является объект Index, предоставляющий набор строк, использующий соответствующий индекс для получения набора данных в упорядоченном виде. Существуют также специальные объекты типа Rowset - schema rowsets, содержащие метаданные (то есть сведения о структуре данных), и view rowsets, содержащие подмножество строк и столбцов объекта Rowset. Помимо четырех основных объектов, перечисленных выше, существуют и другие объекты OLE DB. Они нужны для перечисления источников данных, управления транзакциями, обработки ошибок и др. Некоторые из них мы рассмотрим ниже. Объект EnumeratorОбъект Enumerator необходим для получения списка доступных объектов, обеспечивающих доступ к источникам данных (OLE DB-провайдеров). Этот объект используется потребителями данных для поиска соответствующих объектов. В большинстве случаев сведения, возвращаемые объектом Enumerator, извлекаются из системного реестра. Этот объект реализует интерфейс ISourceRowset и возвращает объект Rowset с описанием всех источников данных и других доступных с его помощью объектов Enumerator. Для этой цели используется метод GetSourcesRowset интерфейса ISourceRowset. Объект TransactionОбъект Transaction поддерживает транзакции в источнике данных. Транзакции, как мы уже знаем из первой статьи данного цикла, позволяют определить группу операций, которые либо все вместе выполняются, либо все вместе отменяются. Транзакции бывают локальными и распределенными. Локальные транзакции - это транзакции, выполняемые в контексте единого провайдера данных. Провайдер, поддерживающий локальные транзакции, должен реализовать интерфейс ITransactionLocal. Транзакция начинается с вызова метода StartTransaction, завершается с помощью метода Commit или откатывается с помощью Abort. Способность провайдера поддерживать транзакции может быть определена с помощью интерфейса IDBProperties. Распределенные транзакции выполняются в контексте нескольких провайдеров данных. Для выполнения таких транзакций потребители используют интерфейс TtransactionJoin, доступный только если провайдер данных поддерживает распределенные транзакции. В этом случае потребитель вызывает метод JoinTransaction для регистрации сессии в распределенной транзакции. После присоединения к распределенной транзакции потребитель использует интерфейс ITransaction для завершения или отката транзакции. Объект ErrorВ дополнение к кодам возврата и информации о состоянии, свидетельствующей об успехе или неуспехе вызова любого из методов OLE DB, OLE DB-провайдеры могут предоставлять расширенную информацию об ошибках с помощью объекта Error. Потребители данных могут использовать интерфейс ISupportErrorInfo для того, чтобы определить, может ли данный объект возвратить объект Error, и если да, то каковы эти интерфейсы. Подробности об OLE DB можно найти на Web-сайте компании Microsoft: http://www.microsoft.com/data/oledb или в следующих группах новостей на http://www.compress.ru/Temp/541/: Выше мы уже перечислили ряд стандартных OLE DB-провайдеров, доступных в составе Microsoft Data Access Components и некоторых других продуктов Microsoft. Далее мы выясним, где можно найти OLE DB-провайдеры сторонних производителей и даже инструменты для создания собственных провайдеров. Поставщики OLE DB-провайдеровМногие производители СУБД поставляют OLE DB-провайдеры в составе своих продуктов. В табл. 2 приведен список подобных производителей серверных СУБД. Таблица 2
Помимо этого существуют компании, производящие OLE DB-провайдеры для различных источников данных. Они перечислены в табл. 3. Таблица 3
Наиболее актуальную информацию об OLE DB-провайдерах можно найти на сайте, посвященном Microsoft Universal Data Access: http://www.microsoft.com/data/partners/products.htm В случае когда вам необходимо создать собственный OLE DB-провайдер, есть несколько инструментов, доступных на рынке. Они показаны в табл. 4. Таблица 4
Рассмотрев OLE DB, мы можем перейти к обсуждению ADO и его взаимодействию с OLE DB. Microsoft ActiveX Data ObjectsADO, как мы знаем, представляет собой высокоуровневый программный интерфейс для доступа к OLE DB-интерфейсам. Он позволяет манипулировать данными с помощью любых OLE DB-провайдеров, как входящих в состав Microsoft Data Access Components некоторых других продуктов Microsoft, так и произведенных сторонними производителями. ADO содержит набор объектов, используемых для соединения с источником данных, для чтения, добавления, удаления и модификации данных. Объект ADO Connection применяется для установки связи с источником данных. Он представляет единственную сессию. Этот объект позволяет изменить параметры соединения с базой данных, а также начать или завершить транзакцию. Используя объект Connection, мы можем выполнять команды (например, SQL-запросы) с помощью метода Execute. Если команда возвращает набор данных, автоматически создается объект Recordset, который возвращается в результате выполнения этого метода. Объект Error используется для получения сведений об ошибках, возникающих в процессе выполнения. Объект Command представляет собой команду, которую можно выполнить в источнике данных. Команда может содержать SQL-предложение или вызов хранимой процедуры. В последнем случае для определения параметров процедуры может быть использована коллекция Parameters объекта Command. Объект Recordset - это набор записей, полученных из источника данных, и может быть использован для добавления, удаления, изменения, просмотра записей. Данный объект может быть открыт непосредственно или создан с помощью объектов Connection или Command. Объект Field - это колонка в наборе данных, представленных объектом Recordset. Он может быть использован для получения значений конкретного поля, его модификации, извлечения метаданных, таких как имя колонки и тип данных. На рис. 4 изображена объектная модель ADO. Рис. 4 Библиотека ADO 2.5, являющаяся составной частью операционной системы Windows 2000, содержит два новых объекта - Record и Stream. Объект Record представляет одну запись внутри объекта Recordset и может быть использован для работы с гетерогенными и иерархическими данными. Объект Stream представляет двоичные данные, связанные с объектом Record. Например, если объект Record представляет собой файл, то его объект Stream должен содержать данные внутри этого файла. OLE DB и ADOРанее в этой статье мы уже рассмотрели некоторые основные объекты OLE DB. Теперь настало время показать, как объекты ADO используют OLD DB:
Подробную информацию можно найти в Microsoft OLE DB Programmer's Reference, являющемся составной частью Platform SDK. Расширения ADOНачиная с версии 2.1, ADO содержит несколько расширений, на которых мы кратко остановимся ниже. ADO Extensions for Data Definition and Security (ADOX)ADO Extensions for Data Definition and Security (ADOX) представляет собой набор объектов, позволяющих манипулировать метаданными в базах данных и управлять объектами, отвечающими за безопасность. Эти объекты кратко описаны в табл. 5. Таблица 5
Иерархия объектов ADOX показана на рис. 5. Из диаграмм на рисунке следует, что объекты Table, Column и Index имеют стандартную коллекцию Properties. Объекты ADOX представляют большинство основных объектов в типичных реляционных СУБД, и их свойства и методы могут быть использованы для создания этих объектов и манипуляции ими. Рис. 5 ADO Multi-Dimensional Extensions (ADOMD)ADO Multi-Dimensional Extensions (ADOMD) - это набор объектов, позволяющих использовать многомерные данные в ADO-приложениях. Такие данные управляются OLAP-серверами (OLAP, Online Analytical Processing), такими как Microsoft OLAP Server, входящий в комплект поставки Microsoft SQL Server 7.0 (или Analytical Services в Microsoft SQL Server 2000). OLAP-серверы широко применяются в системах принятия решений, где требуется статистический анализ больших объемов данных. Объекты ADOMD кратко описаны в табл. 6. Таблица 6
Иерархия объектов ADOMD показана на рис. 6. Рис. 6 Jet and Replication Objects (JRO) Jet and Replication Objects - набор объектов, специально предназначенных для использования совместно с Microsoft Jet OLE DB Provider. Его свойства позволяют создавать, модифицировать и синхронизировать реплики. Реплика - это копия базы данных, изменения в которой синхронизируются с главной базой данных (master database). Объект Replica используется для создания новых реплик, модификации свойств существующих реплик и синхронизации изменений с другими репликами. Объект JetEngine применяется для сжатия баз данных и обновления данных из кэша памяти. Иерархия объектов JRO показана на рис. 7. Рис. 7 Подробности об ADO можно найти на Web-сайте компании Microsoft: http://www.microsoft.com/data/ado или в следующих группах новостей на http://msnews.microsoft.com/: Где найти MDACMicrosoft Data Access Components можно найти на Web-сайте компании Microsoft: http://www.microsoft.com/data, а также в составе Delphi 5 и C++Builder 5 Enterprise, Microsoft Office 2000, Internet Explorer 5.0. Рекомендуется периодически обновлять версию MDAC, получая ее с сайта компании Microsoft, - это гарантирует наличие последних версий всех компонентов MDAC. ADO 2.5 является частью Windows 2000 и не требует отдельной установки. MDAC Software Development Kit, который может потребоваться разработчикам ADO-приложений, входит в состав Microsoft Platform SDK. Он может быть заказан на CD-ROM или получен на Web-сайте компании Microsoft. ЗаключениеВ данной статье мы рассмотрели основные части Microsoft Data Access Components (MDAC) - набора технологий, реализующих универсальный механизм доступа к данным Microsoft. Мы узнали, что универсальный механизм доступа к данным (Universal Data Access) представляет собой стратегию предоставления доступа к любому типу информации предприятия, включая реляционные и нереляционные данные. Далее мы рассмотрели основные компоненты архитектуры универсального механизма доступа к данным Microsoft. Мы узнали, что:
Кроме того, мы рассмотрели основные объекты OLE DB и ADO и выяснили, как они взаимодействуют друг с другом. Перечислив стандартные OLE DB-провайдеры, доступные в составе Microsoft Data Access Components и некоторых других продуктов Microsoft, мы обсудили, какие OLE DB-провайдеры сторонних производителей доступны в настоящее время и какие в данный момент имеются инструменты для производства собственных провайдеров. Мы также рассмотрели расширения ADO, доступные начиная с версии 2.1:
Несколько слов хотелось бы сказать об универсальных механизмах доступа к данным в целом. Как мы видим, механизм, основанный на применении OLE DB и ADO, имеет все основания претендовать на роль ключевой технологии доступа к данным для Windows-приложений, ибо:
Отметим также, что расширяемая объектная модель ADO позволяет придавать последним реализациям этой технологии новые возможности, что, скорее всего, приведет к повышению популярности этой технологии. Этой статьей мы закончили обзор универсальных механизмов доступа к данным. Следующая статья данного цикла будет посвящена языку SQL, широко применяемому ныне для манипуляции данными. КомпьютерПресс 8'2000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |