Visual2000 · Архив статей Колесова & Павловой
Андрей Колесов, Ольга Павлова
© 1999, Андрей Колесов, Ольга Павлова
DAO, ADO, RDO... Все это похоже на какую-то игру слов, где присутствуют два ключевых понятия: данные и объекты. (Data Access Objects — объекты доступа к данным, ActiveX Data Objects — ActiveX-объекты работы с данными, Remote Data Objects — объекты удаленных данных.) На самом же деле речь здесь идет о разных технологиях доступа к данным (см. приложение "Сравнение ADO, DAO и RDO"), которые имеют не только разные внутренние механизмы, но и, что, может быть, гораздо важнее для прикладного программиста, разные перспективы на будущее.
DAO и RDO известны уже достаточно давно, и появление двух разных механизмов было связано с необходимостью оптимизации решения двух отдельных задач: доступа к локальным и удаленным базам данных соответственно. Однако естественное развитие вычислительных систем привело к необходимости создания единого механизма, который обеспечил бы единый подход при работе с БД различных классов.
В результате несколько лет назад Microsoft предложила в качестве единого интерфейса для доступа к локальным и удаленным данным новую технологию ADO, которая сегодня является частью архитектуры Microsoft Universal Data Access (MUDA). (Обзор этой архитектуры см. Федоров А. "Универсальный доступ к данным: Microsoft UDA", КомпьютерПресс ь 1'99, с. 144).
Основой MUDA является OLE DB — низкоуровневый программный COM-интерфейс доступа к данным, который представляет собой развитие идеологии ODBC. Однако если ODBC предназначен для работы с реляционными базами данных (Access, DBF, SQL и др.), то OLE DB предлагает единообразный метод доступа к данным, хранящимся в разных источниках информации, в том числе и в нереляционных БД (например, в папках систем электронной почты или простых файлах), обеспечивая при этом поддержку работы с наборами данных и иерархическими наборами записей, неподключенными постоянно к сети.
Поставщиками таких данных (OLE DB Provider) могут быть любые источники (в том числе приложения), написанные в соответствии со спецификациями OLE DB. Так, доступ к базам данных ODBC выполняется с помощью OLE DB Provider for ODBC.
ADO представляет собой прикладной объектный интерфейс более высокого уровня, который упрощает доступ к средствам OLE DB разработчикам, использующим языки высокого уровня. В 1998 году Microsoft выпустила модернизированный вариант ADO 2.0, который был впервые включен в состав Visual Studio 6.0 и его автономных средств, в том числе VB 6.0.
ADO 2.0 представляет собой набор объектов, краткое описание которых приведено в табл. 1. VB-разработчик может работать напрямую или с помощью специальных средств, включенных в пакет. В первую очередь это новые элементы управления, функционирующие на основе OLE DB: ADO Data (является примерным аналогом уже известных элементов управления Data и Remote Data), DataGrid (DBGrid), DataList (DBList) и DataCombo (DBCombo).
Кроме того, VB 6.0 включает два новых инструмента работы с базами данных на основе OLE DB: конструктор Data Environment для установления связи с базами данных и создания отчетов, а также окно Data View для просмотра баз данных. (Мы уже подробно рассматривали эти средства в статье "Использование конструктора VB 6.0 Data Environment"). Следует также отметить, что VBпрограммист может создавать собственные поставщики данных OLE DB с помощью модуля классов (мы предполагаем рассмотреть этот вопрос в будущем).
Для использования ADO в VB-приложении нужно установить ссылку к библиотеке Microsoft ActiveX Data Objects Library 2.0 с помощью команды Project|References. Обратите внимание, что возможности ADO 2.0 доступны и при работе в среде VB 5.0. Для этого нужно установить на компьютер комплект MS Data Access Components, который можно загрузить, в частности, с узла www.microsoft.com/data/download.htm. Однако вы не сможете использовать элементы управления VB 5.0 совместно с элементом управления ADO Data. Впрочем, при желании можно воспользоваться компонентами независимых разработчиков, в том числе свободно распространяемых (например, по адресу: www.isgsoft.com).
Итак, теперь VB 6.0 поддерживает три различные технологии работы с базами данных. Очевидно, что каждая технология имеет свои плюсы и минусы и выбор нужного инструмента определяется спецификой задачи, а также квалификацией и навыками разработчика. Мы уже не раз подчеркивали, что эффективность конкретного применения инструмента определяется не только (или даже не столько) его внутренним совершенством, но и умением программиста работать с ним.
Тем не менее стоит упомянуть о результатах тестирования производительности разных методов доступа к данным, приведенным в статье "VS 6.0 Benchmarks: New Features Don't Impact Speed" в журнале VBPJ (табл. 2). Там говорится об исследовании скоростных характеристик разных средств, входящих в состав Visual Studio 6.0, а также VB 5, для различных режимов работы программ (графика, математические задачи, обработка строк и пр.), в том числе и при работе с базами данных.
По результатам тестирования при работе с удаленными данными быстродействие ADO и RDO примерно одинаково. Что же касается локальных баз данных, то скорость ADO в 3-5 раз ниже, чем у DAO. Это, конечно, не очень здорово, но следует учитывать, что универсальный механизм всегда уступает специализированным, имея в качестве преимущества упрощение процесса разработки. (Современный стиль разработки заключается именно в таких приоритетах: главное — сократить трудоемкость разработки, а уже потом думать о повышении эффективности приложений. Можно осуждать подобный прагматизм, но факт остается фактом.)
Более важным является другой момент: Microsoft объявила, что будет усовершенствовать и обновлять только модель ADO (что соответствует общей стратегии корпорации на унификацию разных технологий на базе ActiveX), то есть DAO и RDO постепенно должны сойти со сцены.
Вывод из этого очевиден: если сейчас вы используете DAO или RDO для доступа к данным, то в конце концов вам, вероятно, придется совершить этот переход к ADO в новых разработках. Но когда это лучше сделать? С одной стороны, лучше раньше, чем позже. С другой — торопиться не надо. Здесь следует отметить еще два важных момента.
Многие VB-эксперты указывают на недостатки существующей сегодня версии ADO. Если не принимать во внимание снижение производительности, то главный упрек заключается в наличии довольно большого числа программных ошибок. (Microsoft придерживается принципов отраслевого единства: заработал сам на обновлении технологий — дай возможность заработать и другим поставщикам. Так что если вы хотите получить прежнюю производительность, то купите себе новый, более мощный компьютер.) В связи с этим эксперты журнала VBPJ советуют разработчикам дождаться выхода ADO 2.5. Впрочем, классический принцип освоения новых технологий говорит о том, что их использование в реальных системах лучше начинать с версии 3.
Так что вопрос о том, когда переходить к ADO, решать вам, но готовиться к этому нужно уже сегодня.
Мы уже отмечали выше, что Microsoft позиционирует свою технологию ActiveX Data Object как стратегическую технологию доступа к данным, которая должна со временем заменить уже давно существующие DAO и RDO. Однако до настоящего времени широкому принятию на вооружение ADO во многом мешали два фактора: существование ряда функциональных ограничений, а также "сырость" ее реализации (попросту говоря, ниличие ошибок).
По своим возможностям ADO 2.0, которая входит в состав Visual Studio 6.0, уступает уже давно опробованной технологии DAO. Например, разработчики, использующие ядро Access/Jet 3.51, не имеют возможности создавать такие объекты баз данных, как таблицы и поля. Метод OpenSchema объекта Connection позволяет просматривать часть структуры базы данных, однако его нельзя применять для создания баз данных или изменения структуры уже существующих баз данных. ADO 2.0 также не разрешает просматривать ряд элементов базы данных Jet, которые относятся к категории объектов безопасности. Более того, вы не можете даже выполнять программным образом многие операции над ядром Jet.
Однако в июне нынешнего года Microsoft объявила о выпуске новой версии ADO 2.1, которая может помочь справиться со многими проблемами. Номер версии указывает на то, что мы имеем дело не с новым выпуском технологии ADO, а с расширенным вариантом ADO 2.0, содержащим большой набор новых функций и несколько усовершенствованных функций из предыдущих выпусков ADO.
Кроме модернизированного варианта основной библиотеки в состав ADO 2.1 входит дополнительная библиотека ActiveX Data Objects Extensions for DDL and Security или просто ADOX, которая предоставляет разработчикам обширный набор инструментов для получения доступа к структуре, модели безопасности и процедурам, хранящимся в базе данных. В самом большом выигрыше окажутся программисты, использующие ядро Access/Jet, хотя ADOX также работает с драйверами SQL Server и ODBC OLE DB. Но следует иметь в виду, что Microsoft пока не обеспечивает поддержку ADOX со своими другими драйверами OLE DB.
Для использования ADOX в своем VB-проекте выберите Microsoft ADO Ext. 2.1 for DDL and Security в окне References (Project|References) и тогда вы получаете доступ к объектной модели ADOX. (Перед этим нужно установить ссылку Microsoft ActiveX Data Objects 2.1 Library.) Убедитесь, что вы работаете с правильной версией ADO — библиотека ADOX работает только с ADO версии 2.1. Модернизированный вариант основной библиотеки также обладает рядом новых функциональных возможностей:
Хотя ADO в целом покрывает функциональность DAO и RDO, она не является совместимой с ними на уровне языка программирования. Это означает, что модернизация уже существующих программ для использования ADO потребует как минимум преобразования кода приложения. В некоторых случая коррекция программ сводится к достаточно простой замене функций, но порой, особенно для наиболее эффективного использования новых возможностей ADO, может потребоваться более серьезная переработка.
DAO (Data Access Objects) был первым объектно-ориентированным интерфейсом, включенным в механизм работы с базами данных Microsoft Jet (используется в MS Access). Он позволял VB-программистам работать также с широким кругом реляционных базам данных через технологию ODBC. DAO наилучшим образом подходит для относительно небольших, локальных баз данных.
RDO (Remote Data Objects) является объектно-ориентированным интерфейсом доступа к данным, в котором сочетается простой стиль программирования DAO с высокой производительностью и гибкостью низкоуровневых функций ODBC. Доступ к локальным базам данных Jet и ISAM выполняется в RDO через драйверы ODBC, что снижает его быстродействие по сравнению с DAO. Однако RDO обеспечивает возможность работы с большим числом БД различных разработчиков, предоставляя средства доступа к таким элементам, как, например, запоминаемые процедуры и сложные результирующие наборы данных.
ADO является преемником DAO/RDO. В этой технологии реализована другая объектная модель: объектов стало меньше, но при этом их структура стала иерархической, увеличилось число свойств, методов, аргументов и событий. Функциональность ADO 2.0 наиболее близка к RDO, она работает с источниками данных, имеющих интерфейс OLE DB, обеспечивая поддержку DHTML-технологий и взаимодействие с данными, не имеющих постоянного подключения в сети. В настоящее время ADO не поддерживает весь спектр функций DAO, в частности язык определения данных (DDL). Microsoft обещает включить в будущие версии ADO компоненты DDL. По-видимому, не следует выполнять миграцию в ADO для большинства приложений, использующих DAO (возможно, кроме случая применения ODBCDirect), непосредственно сейчас, хотя для клиент-серверных приложений это уже имеет смысл.
Список объектов ADO
Объект | Описание |
Connection | Обеспечивает обмен данными |
Command | Внедряет SQL-оператор |
Parameter | Внедряет параметр SQL-оператора |
Recordset | Обеспечивает навигацию и управление данными |
Field | Внедряет столбец объекта Recordset |
Error | Указывает ошибку установления связи |
Property | Внедряет характеристику объекта ADO |
Список коллекций ADO
Коллекция | Описание |
Errors | Все объекты Error, созданные в результате единичной ошибки при установлении связи |
Parameters | Все объекты Parameter, связанные с объектом Command |
Fields | Все объекты Field, связанные с объектом Recordset |
Properties | Все объекты Property, связанные с объектом Connection, Command, Recordset или Field |
Список обработчиков событий ADO
Событие | Описание |
Установление связи | |
BeginTransComplete, CommitTransComplete, RollbackTransComplete | Управление транзакциями. Сообщает о том, что текущая транзакция либо началась, либо завершилась, либо произошел ее откат |
WillConnect, ConnectComplete, Disconnect | Управление связью. Сообщает о том, что текущая связь либо будет установлена, либо уже установлена, либо завершена |
WillExecute, ExecuteComplete | Управление выполнением команды. Сообщает о том, что выполнение текущей команды либо начнется, либо завершилось |
InfoMessage | Информационное сообщение. Сообщает о существовании дополнительной информации о текущей операции |
Объект Recordset | |
FetchProgress, FetchComplete | Состояние выборки. Сообщает либо о ходе выполнения операции выборки данных, либо о том, что эта операция завершена |
WillChangeField, FieldChangeComplete | Управление изменением поля. Сообщает о том, что значение текущего поля либо изменится, либо уже изменилось |
WillMove, MoveComplete, EndOfRecordset | Управление навигацией. Сообщает о том, что текущее положение строки в объекте Recordset либо изменится, либо уже изменился, либо был достигнут конец файла |
WillChangeRecord, RecordChangeComplete | Управление изменением строки. Сообщает о том, что некоторые данные в текущей строке объекта Recordset либо изменятся, либо уже изменились |
WillChangeRecordset, RecordsetChangeComplete | Управление изменением объекта Recordset. Сообщает о том, что некоторые данные объекта Recordset либо изменятся, либо уже изменились |
Рейтинг | Метод доступа | Показатель (операций в минуту) |
Работа с локальными данными | ||
1. | DAO | 49 |
2. | RDO, server-side cursor | 41 |
3. | ADO OLE DB, server-side cursor | 35 |
4. | RDO, client-side cursor | 32 |
5. | ADO OLE DB, client-side cursor | 27 |
6. | ADO ODBC, server-side cursor | 14 |
7. | ADO ODBC, client-side cursor | 10 |
Работа с удаленными данными | ||
1. | ADO OLE DB, server-side cursor | 22,5 |
2. | ADO ODBC, server-side cursor | 22 |
3. | RDO, client-side cursor | 21,5 |
4. | ADO OLE DB, client-side cursor | 19 |
5. | ADO ODBC, client-side cursor | 18,5 |
6. | RDO, server-side cursor | 16,5 |
Источник: Журнал VBPJ N 14'98, с. 30-44. Ash Rofail, Yasser Shohoud "VS 6 .0 Benchmarks"
Примечание. Мы уже неоднократно подчеркивали, что любые результаты тестирования являются достаточно условными. И абсолютные, и относительные характристики могут существенно меняться в зависимости от конкретных условий: оборудования, системного ПО, квалификации разрабочика и, конечно, структуры и содержимого базы данных. Но точно так же подобные оценки представляют интерес хотя бы потому, что заставляют разработчика внимательнее изучить возможности повышения эффективности своих приложений, в том числе проведя соответствующее исследование разных методов.