Russian Belarusian English German Japanese Ukrainian

ADO

ADO (от англ. ActiveX Data Objects - «объекты данных ActiveX») - интерфейс программирования приложений для доступа к данным, разработанный компанией Microsoft (MS Access, MS SQL Server) и основанный на технологии компонентов ActiveX. ADO позволяет представлять данные из разнообразных источников (реляционных баз данных, текстовых файлов и т.д.) в объектно-ориентированном виде.
Использование этой технологий подразумевает использование настраиваемых провайдеров данных. Технология ADO обеспечивает универсальный механизм доступа из приложений к информации источников данных. Эта технология основана на стандартных интерфейсах СОМ, являющихся системным механизмом Windows. Это позволяет удобно распространять приложения баз данных без вспомогательных библиотек.

Визуальное конструирование запросов

Для удобного конструирования запросов можно использовать визуальный конструктор, вызываемый командой FiIe\New\QBE Query программы Database Desktop. При этом открывается окно Select File, где нужно указать имя главного файла таблицы, на основании данных которой строится запрос. После выбора файла и нажатия кнопки Open открывается окно визуального конструктора.
 
В этом окне показаны имена таблицы и всех ее полей. Под именем каждого поля находятся флажок и текстовое поле (слева от флажка для имени таблицы и справа для имени поля). С помощью визуального конструктора можно:
  • создавать и изменять запрос по образцу;
  • выполнять запрос по образцу;
  • сохранять запрос по образцу как SQL-запрос.
Большая часть работы с запросом по образцу проходит в окне визуального конструктора, где для каждого поля таблицы задаются условия отбора и сортировки. Для этого щелчком правой кнопки мыши в поле имени таблицы (слева от флажка) вызывается контекстное меню, в котором выбирается вид запроса:
  • пустая строка (отбор и редактирование записей таблицы);
  • INSERT (вставка записей в таблицу);
  • DELETE (удаление записей из таблицы);
  • SET (сравнение записей в таблицах).
Для выполнения запроса нужно выполнить команду Query\Run Query программы Database Desktop. Перед выполнением запроса производится проверка его правильности.
 
Для получения текста запроса, соответствующего визуальному запросу, нужно выполнить команду Query\Show SQL или нажать на панели инструментов кнопку с буквами SQL. При отсутствии ошибок в конструкции запроса автоматически открывается окно SQL Editor (Редактор SQL-запроса), в котором содержится текст запроса на языке SQL. При наличии ошибок окно Редактора SQL-запроса не появляется, а выдается сообщение об ошибке.
 
Запрос можно сохранять (Save) на диске под своим именем или под другим (Save As). Можно также открыть ранее сохраненный запрос (Open). Файл запроса имеет расширение qbe. (В скобках указаны команды меню File программы Database Desktop.)

Вызов хранимых процедур

Для вызова хранимых процедур по технологии ADO служит компонент ADOStoredProc. По своим возможностям и технике использования он подобен своему аналогу из BDE. Установка соединения с хранилищем данных и управление набором данных аналогичны используемым для компонента ADOTable. Для отображения данных (выходных параметров) к источнику данных также подключаются компоненты отображения.
 
Для задания имени хранимой процедуры служит свойство ProcedureName типа widest ring. Свойство Parameters типа TParameters служит для определения входных параметров процедуры. А именно, после задания имени хранимой процедуры в свойстве parameters отображаются входные параметры процедуры. Их можно просмотреть с помощью Инспектора объектов.
 
Выходные параметры хранимой процедуры являются объектами полей рассматриваемого компонента ADOStoredProc. Чтобы просмотреть и изменить их значения, достаточно с помощью контекстного меню компонента ADOStoredProc вызвать редактор полей Fields Editor. С помощью команд редактора можно легко изменить состав полей (выходные параметры), отображаемых в наборе данных компонента ADOStoredProc.

Выполнение запросов

Для выполнения SQL-запросов при использовании технологии ADO служит компонент ADOQuery. По функциональным возможностям и технике применения этот компонент во многом подобен компоненту Query. Установка соединения с хранилищем данных, свойства и методы фильтрации и поиска аналогичны используемым для компонента ADOTable.
 
Текст запроса задается с помощью свойства SQL типа TStrings. С помощью свойства Parameters типа TParameters определяются параметры запроса. Открытие набора данных может быть выполнено с помощью свойства Active типа bool или с помощью метода open. Если же запрос не должен возвращать данных, то для открытия набора данных можно вызвать метод ExecSQL.

Доступ к таблицам

Для обеспечения доступа к таблицам хранилищ данных по технологии ADO служит компонент ADOTable. Для установления соединения с хранилищем данных этого компонента через провайдеры ADO служит свойство ConnectionString или Connection. Для управления набором данных таблицы в приложение включают компонент источника данных DataSource. При этом свойству DataSet этого компонента в качестве значения задается имя компонента ADOTable, Для отображения данных таблицы к источнику данных подключаются различные компоненты отображения, к примеру, DBGrid.
 
После установления связи компонента ADOTable с хранилищем данных с помощью свойства TableName типа widestring задается имя таблицы. Не все провайдеры ADO допускают непосредственный доступ к таблицам, поэтому может потребоваться доступ с помощью SQL-запроса. Вариант доступа к данным таблицы определяет свойство TableDirect типа bool. Если оно имеет значение false (по умолчанию), то компонент ADOTable автоматически генерирует SQL-запрос для доступа к таблице, в противном случае выполняется непосредственный доступ к данным таблицы.
 
Рассматриваемый нами компонент по своим возможностям и технике работы с ним во многом схож с компонентом Table. Здесь также с помощью редактора полей можно задавать свойства отдельных полей. При этом имеется ограничение, состоящее в том, что в компонентах ADO нельзя работать со словарями. Поэтому свойства полей требуется задавать вручную. Кроме того, у драйверов ADO имеются ограничения по работе с отдельными типами полей, в частности, с графическими.
 
При программировании действий по работе с хранилищем данных с помощью рассматриваемого компонента используются аналогичные средства, что и в случае компонента Table. В частности, для навигации по табличному набору данных используются методы First, Last, Next и Prior. Для поиска записей используются методы Find, Seek и Locate.

Отбор записей из таблицы

При отборе записей из таблицы щелчком правой кнопки мыши на флажках полей вызывается контекстное меню, в котором можно выбрать метку для флажка:
  • пусто (поле не включается в результат запроса);
  • галочка со знаком + (поле включается в результат запроса);
  • галочка (поле включается в результат запроса с сортировкой записей по возрастанию значений этого поля);
  • галочка с черной стрелкой (поле включается в результат запроса с сортировкой записей по убыванию значений этого поля);
  • галочка с буквой G (поле включается в результат запроса и используется для группирования записей).
Кроме того, справа от флажка для каждого поля таблицы можно вручную ввести условие отбора записей. Поле, для которого допускается ввод условия запроса, обозначается текстовым курсором. Этот курсор отображается черным прямоугольником и переключается мышью или клавишами управления курсором. При вводе (редактировании) условия отбора черный прямоугольник сменяется мигающей вертикальной линией.
 
При выполнении запроса из таблицы отбираются записи, для которых значение ученой степени (поле Degree) равно ктн. Кроме этого поля, в результат запроса включаются поля имени Name и должности Post.

Связывание таблиц

Можно построить запрос по образцу не только для одиночных таблиц, но и для связанных таблиц. Для этого требуется:
  • добавить к запросу новую таблицу;
  • связать между собой две таблицы.
Добавление таблицы выполняется нажатием кнопки Add Table панели инструментов и выбором в открывшемся окне Select File главного файла таблицы.
 
Для связывания таблицы нужно нажать кнопку Join Tables панели инструментов, при этом кнопка останется в нажатом состоянии, а к указателю мыши добавляется изображение двух таблиц. Затем щелчком на полях связи обеих таблиц между ними устанавливается соединение, получающее имя joini. Имя соединения отображается в полях связи. Так же можно связать между собой три и более таблиц.
 
Для связанных таблиц операции отбора, редактирования, вставки и удаления записей выполняются так же, как и для одиночных таблиц. Запрос выводит из подчиненной таблицы salary записи с окладом для должности, которая указана в главной таблице Sempioyee данных о сотрудниках. Отбор записей осуществляется по полю Post должности, в результирующий набор данных включаются поля Name фамилии сотрудника, Post должности и Degree ученой степени.
 
Для удаления таблицы из запроса нужно нажать кнопку Remove Tables панели инструментов (с изображением таблицы и знака -), в открывшемся одноименном окне выбрать имя таблицы и нажать кнопку OK.

Технология ADO

Технология Microsoft ActiveX Data Objects (ADO) представляет собой универсальный механизм доступа к различным источникам данных из приложений баз данных. Основу технологии ADO составляет использование набора интерфейсов общей модели объектов СОМ, описанных в спецификации OLE DB. Достоинством этой технологии является то, что базовый набор интерфейсов OLE DB имеется в каждой современной операционной системе Microsoft. Отсюда следует простота обеспечения доступа приложения к данным. При использовании технологии ADO приложение БД может использовать данные из электронных таблиц, таблиц локальных и серверных баз данных, XML-файлов и т.д.
 
В соответствии с терминологией ADO любой источник данных (базу данных, файл, электронную таблицу) называют хранилищем данных. Приложение взаимодействует с хранилищем данных с помощью провайдера. Для каждого типа хранилища данных используется свой провайдер ADO. Провайдер обеспечивает обращение к данным хранилища с запросами, интерпретацию возвращаемой служебной информации и результатов выполнения запросов для передачи их приложению.
 
Все объекты и интерфейсы ADO являются объектами и интерфейсами СОМ. Согласно спецификации OLE DB в состав СОМ входит следующий набор объектов:
  • Command (команда) - служит для обработки команд (обычно SQL-запросов);
  • Data Source (источник данных) - используется для связи с провайдером данных;
  • Enumerator (перечислитель) - служит для перечисления провайдеров ADO;
  • Error (ошибка) - содержит информацию об исключениях;
  • Rowset (набор рядов) - строки данных, являющиеся результатом выполнения команды;
  • Session (Сессия) - совокупность объектов, обращающихся к одному хранилищу данных;
  • Transaction (транзакция) - управление транзакциями в OLE DB.
В системе программирования С++ Builder компоненты, используемые для создания приложений по технологии ADO, расположены на странице ADO Палитры компонентов. Охарактеризуем кратко назначение этих компонентов:
  • ADOConnection - ADO-соединение, используется для установки соединения с ADO-источником данных и обеспечивает поддержку транзакций;
  • ADOCommand - ADO-команды, используются для выполнения SQL-команд доступа к ADO-источнику данных без возвращения результирующего набора данных;
  • ADODataSet - набор данных ADO, обеспечивает доступ к одной или более таблице ADO-источника данных и позволяет другим компонентам управлять этими данными, связываясь с компонентом через компонент Datasource аналогично тому, как используется компонент Dataset. Может использоваться в компонентах ADOTabie, ADOQuery, ADOStoredProc;
  • ADOTabie - таблица ADO, обеспечивает доступ к одной таблице ADO-источника данных и позволяет другим компонентам управлять этими данными, связываясь с компонентом ADOTable через компонент DataSource;
  • ADOQuery - запрос ADO, позволяет выполнять SQL-команды для получения информации из ADO-источника данных и позволяет другим компонентам управлять этими данными, связываясь с компонентом ADOTable через компонент DataSource;
  • ADOStoredProc - хранимая процедура ADO, позволяет приложениям получать доступ к хранимым процедурам, используя интерфейс ADO;
  • RDSConnection - RDS-соединение, служит для управления передачей объекта Recordset от одного процесса (компьютера) к другому. Компонент используется для создания серверных приложений.
Компонент ADOconnection может использоваться как посредник между данными и другими компонентами ADO, что позволяет более гибко управлять соединением. Возможен вариант использования других компонентов ADO путем установления соединения с источником данных напрямую. Для этого компоненты ADO имеют свойство ConnectionString, с помощью которого могут создавать свой собственный канал доступа к данным.

Управление соединениями и транзакциями

Установление соединения с хранилищем данных может осуществляться компонентами доступа к данным ADO через их свойство Connectionstring. Кроме того, компоненты доступа к данным ADO могут соединяться с хранилищем данных через свойство Connection, связывающее их с компонентом соединения ADOConnection. При этом последний компонент связывается с хранилищем данных через свое свойство Connectionstring.
 
Достоинство применения компонента ADOConnection для связи компонентов доступа к данным с хранилищами данных состоит в том, что он позволяет управлять параметрами соединения и транзакциями. С помощью свойства CoursorLocation типа TCursorLocation можно задать библиотеку, используемую курсором при соединении с хранилищем данных. Используемое по умолчанию значение clUseClient означает, что все данные располагаются и обрабатываются на компьютере-клиенте. При этом достигается наибольшая гибкость: возможны операции, которые могут не поддерживаться сервером. Тем не менее, операторы SQL все равно выполняются на сервере, а клиенту передаются результаты выполнения запроса.
 
Если свойству CoursorLocation задано значение clUseServer, то обработка данных ведется на сервере. Такое значение свойства целесообразно устанавливать в случае задания команд, возвращающих большой объем данных.
 
При использовании технологии ADO соединение может быть синхронным или асинхронным, что можно задать с помощью свойства Connectoptions типа TConnectoption, который описан так:
enum TConnectOption {coConnectUnspecified, coAsyncConnect};
Значение coConnectUnspecified задает синхронное соединение, которое всегда ожидает результат последнего запроса, значение coAsyncConnect задает асинхронное соединение, при котором новые запросы выполняются, не ожидая ответа от предыдущих запросов.
 
Перед установлением соединения возникает событие OnWillconnect типа TWillConnectEvent, который описан так:
TWillConnectEvent = procedure(Connection: TADOConnection; var ConnectionString, UserID, Password: WideString; var ConnectCptions: TConnectOption; var EventStatus: TEventStatus) of object;
Здесь:
  • Connection указывает на соответствующий компонент соединения
  • ConnectionString, UserlD, Password определяют строку соединения, имя и пароль пользователя соответственно
  • Connectoptions указывает на синхронное или асинхронное соединение
Параметр EventStatus указывает на успешность выполнения запроса на соединение. Тип этого параметра описан так:
enum TEventStatus {esOK, esErrorsOccured, esCantDeny, esCancel, esUnwantedEvent};
Здесь:
  • esOK - соединение выполнено успешно
  • esErrorsOccured - ошибка при выполнении операции
  • esCantDeny - незаконченную операцию соединения нельзя отменить
После установки соединения возникает событие OnConnectComplete типа TConnectErrorEvent, который описан так:
typedef void __fastcall (__closure *TConnectErrorEvent)(TADOConnection* Connection, const _di_Error Error, TEventStatus &EventStatus);
В случае возникновения ошибки в процессе соединения параметр EventStatus будет иметь значение esErrorsOccured, а параметр Error будет содержать объект ошибки ADO.
Объекты ошибки ADO содержат информацию об ошибке, возникшей при выполнении операции над каким-либо объектом ADO.
При разрыве соединения возникает событие OnDisconnect типа TDisconnectEvent, который описан так:
typedef void __fastcall (__closure *TDiscorinectEvent)(TADOConnection* Connection, TEventStatus &EventStatus);
Управление транзакциями осуществляется с помощью методов и свойств компонента ADOConnection.
 
Для запуска транзакции используется функция BeginTrans, возвращающая целое значение, т.е. уровень вложенности новой транзакции. В случае успешного запуска транзакции свойство InTransaction принимает значение true, указывающее на то, что компонент соединения находится в транзакции.
 
Для завершения транзакции и сохранения внесенных изменений в хранилище данных используется метод CommitTrans. При успешном его выполнении свойство InTransaction принимает значение false.
 
Для отката транзакции служит метод RollbackTrans. При его успешном выполнении отменяются все изменения, внесенные в ходе транзакции, а свойство InTransaction принимает значение true.
 
Для управления запуском транзакций, оставшихся незавершенными, служит свойство Attributes типа TXасtAttributes. Оно принимает два значения:
  • xaCommitRetaining - незавершенная транзакция начинается при подтверждении предыдущей транзакции
  • xaAbortRetaining - незавершенная транзакция начинается при отмене предыдущей транзакции