Технология ADO в Delphi

Компоненты для работы с Microsoft ActiveX Data Objects (ADO) впервые появились в среде Delphi версии 5.

ADO — это технология стандартного обращения к реляционным структурам данных от Microsoft. Она аналогична BDE по назначению и сродни ему по возможностям.

 

Хочешь получить полноценный видеокурс по Delphi прямо сейчас? Кликни на картинку и оформи заказ:

 

ЗАКАЗАТЬ

 

В основе архитектуры ADO лежит объектная модель компонентов COM (Component Object Model). Все объекты и интерфейсы ADO представляют собой интерфейсы и объекты СОМ.

 

Модель СОМ является базовой для технологий ActiveX и OLE. Проиллюстрировать это отношение можно на примере объекта TObject, как базового объекта для VC L Delphi.

 

Технология СОМ работаете так называемыми СОМ-обьектами. Во многом СОМ-объекты похожи на обычные объекты визуальной библиотеки компонентов Delphi

 

Но, в отличие от последних, СОМ-объекты не содержат поля, в них находятся лишь свойства и методы, а также интерфейсы.

Интерфейсы — это группы логически или семантически связанных процедур, которые обеспечивают связь между поставщиком услуги (сервером) и его клиентом. Названия интерфейсов начинаются с буквы I.

Обычный СОМ-объект включает в себя один или несколько интерфейсов. Кроме того, СОМ-объект содержит методы, которые позволяют приложению пользоваться им.

Технология СОМ имеет два явных плюса:

  • создание СОМ-объектов не зависит от языка программирования. Таким образом, СОМ-объекты могут быть написаны на различных языках;
  • СОМ-объекты пригодны для использования в любой среде программирования под Windows. В число этих сред входятDelphi, Visual С++, С++ Builder, Visual Basic и многие другие.

ПРИМЕЧАНИЕ: Хотя технология СОМ имеет очевидные достоинства, ей свойственны также и минусы, среди которых можно выделить зависимость от платформы. Эта технология применима только в операционной системе Windows и на платформе Intel.

Технология СОМ реализуется с помощью СОМ-библиотек (такие файлы операционной системы, как OLE32.DLL и OLEAUT32.DLL). СОМ-библиотеки содержат набор стандартных интерфейсов, которые отвечают за функциональность СОМ-объекта, а также небольшой набор функций API, обеспечивающих создание СОМ-объектов и управление ими.

В Delphi воплощение и поддержка технологии СОМ называется Delphi ActiveX framework, DAX. Реализация DAX описана в модуле AxCtrls.

Рассмотрим особенности архитектуры ADO (рис. 12.1).

Рис. 12.1. Архитектура ADO 

Технология ADO в Delphi

 

Перечислим основные интерфейсы ADO и кратко поясним их назначение:

  •  интерфейс IConnection выполняет следующие функции:
    • осуществляет связь с сервером;
    • управляет транзакциями;
    • получает информацию о произошедших ошибках (свойство Errors);
    • получает информацию о схеме данных (таблицы, поля и т. д.);
  • интерфейс IRecordset (на нижнем уровне ADO это IRowset) является аналогом TDataSet в Delphi и поддерживает текущее положение и перемещение курсора, закладки (Bookmarks), чтение, изменение и удаление записей и т. п.;
  • интерфейс IReld позволяет получать значение поля, его тип, длину и другие сведения о поле данных;
  • интерфейсы ICommand и IParameter обеспечивают работу с командами источника данных. Синтаксис команд для каждого из источников свой собственный;
  • интерфейс IProperty позволяет получать и устанавливать параметры, специфические для провайдера данных. 

Для работы с механизмом ADO в Delphi 7 предназначены семь стандартных компонентов, расположенных на закладке ADO палитры компонентов (рис. 12.2). 

Рис. 12.2. Закладка ADO

Технология ADO в Delphi

Первый компонент называется ADOConnection. Функционально он аналогичен компоненту Database закладки BDE. С помощью компонента ADOConnection можно указывать местоположение базы данных и работать с транзакциями. Рассмотрим основные свойства компонента ADOConnection, отображаемые в окне инспектора объектов (табл. 12.1).

Следующий компонент закладки ADO называется ADOCommand. Он предназначен для выполнения SQL-команды без возврата результирующего набора данных. Основные свойства этого компонента представлены в табл. 12.2.

Таблица 12.2. Основные свойства компонента ADOCommand

Третий компонент закладки ADO носит имя ADODataSet Его назначение — получение набора данных из одной или нескольких таблиц базы данных. Кроме того, он также позволяет работать с возвращенным набором данных визуальным компонентам, предназначенным для отображения данных. Это наиболее общий компонент для работы с набором данных, который может использоваться вместо компонентов ADOTable, ADOQuery или ADOStoredProc. В таблице 12.3 приведены основные свойства указанного компонента.

Таблица 12.3. Основные свойства компонента ADODataSet 

 

 Следующий компонент закладки ADO называется ADOTable. Он является аналогом компонента Table, расположенного на закладке BDE, и предназначен для доступа к таблице с помощью механизма ADO. Компонент ADOTable имеет свойства, которые мы уже рассматривали ранее в компонентах Table и ADODataSet, поэтому мы не будем возвращаться к ним еще раз.

Компонент ADOQuery представляет собой запрос к базе данных. Это может быть как запрос, в результате которого возвращаются данные из базы (например, SELECT), так и запрос, не формирующий результирующего набора данных (например, INSERT). Компонент аналогичен компоненту Query из BDE. Все основные его свойства мы уже рассматривали в описании свойств компонентов Query н ADODataSet

Компонент ADOStoredProc предназначен для вызова процедуры, хранимой на сервере базы данных. В отличие от BDE и InterBase хранимые процедуры в ADO могут возвращать набор данных, поэтому компонент такого типа является потомком DataSet и может выступать источником данных в компонентах типа DataSource.

 

Последний компонент закладки ADO называется RDSConnection. Этот компонент управляет маршалингом данных, когда набор записей переносится из одного компьютера на другой.

 

ПРИМЕЧАНИЕ: Маршалингом данных называется механизм, который позволяет клиенту получать доступ к объектам, расположенным в другом адресном пространстве или на другом компьютере.

 

На события в ADO возлагаются те же задачи, что и на события в VCL. Многие из событий ADO имеют аналоги в VCL, и соответствующие компоненты вызывают из событий ADO события VCL.
Все события в ADO условно разделим на несколько групп: события соединения, события транзакции, события выполнения команд. События соединения:
  • OnWillConnect — вызывается перед установкой соединения;
  • OnConnectComplete — вызывается после установки соединения;
  • OnDisconnect — активируется при разрыве соединения. Эти события инкапсулированы в компоненте ADOConnection.События транзакции:
  • OnBeginTransComplete — происходят при выполнении BeginTrans;
  • OnCommitTransComplete — происходят при выполнении CommitTrans;
  • OnRollbackTransComplete — вызываются при выполнении RollbackTrans.

События данной группы инкапсулированы в компоненте ADOConnection. События выполнения команд OnWillExecute и OnExecuteComplete вызываются перед выполнением команды и после него соответственно.

Эти события «зашиты» в компоненте ADOConnection, а не в ADOCommand, как можно было бы предположить. Указанная «странность» связана с тем, что в ADO объекта команды как такового нет, и по этой причине он не может получать сообщения.
 
В компонент ADOConnection также встроено событие OnlnfoMessage, которое вызывается по факту прихода с сервера дополнительной информации. Формат и назначение зависят от сервера, с которым вы работаете.
В ADO есть и события, связанные с набором данных, а не с соединением, как вышеописанные. Они инкапсулированы в компоненты, представляющие наборы данных: ADODataSet, ADOTable, ADOQuery и ADOStoredProc.
Эти события можно условно разбить на три группы.
  • События выборки данных.
    •  OnFetchProgress — многократно вызывается в процессе выборки данных;
    •  OnFetchComplete — завершение выборки.
  • Уведомления об изменении положения текущей записи в наборе:
    • OnWillMove — вызывается до изменения положения текущей записи. Позволяет отменить действие;
    • OnMoveComplete — вызывается после изменения положения текущей записи;
    • OnEndOfRecordset — генерируется при достижении конца набора данных. Позволяет добавить новую запись.
  • Уведомления об изменении набора данных.
    • OnWillChangeField, OnFieldChangeComplete — вызываются до и после изменения текущей записи набора;
    • OnWillChangeRecord, OnRecordChangeComplete — вызываются до и после изменения, добавления, удаления строки набора и при отмене этих действий;
    • OnWillChangeRecordset, OnRecordsetChangeComplete — вызываются до и после открытия, закрытия, повторного запроса и синхронизации набора данных.
Многие события допускают прерывание действия. Эта возможность полезна при асинхронной работе с сервером, например, для прерывания слишком длинного запроса.
 
В ADO есть возможность, не имеющая аналогов ни в BDE, ни в InterBase. Это асинхронное выполнение операций с сервером. Асинхронно могут выполняться:
  • установка соединения с сервером (Connection);
  • выполнение команды (Execute);
  • выборка данных (Fetch). 

Для включения этого режима необходимо присвоить свойству ConnectOptions компонента ADOConnection значение coAsyncConnect.
При установлении соединения происходит следующее:
  • вызывается обработчик события OnWillConnect;
  • управление передается программе.
После завершения соединения, как успешного, так и ошибочного, вызывается обработчик события OnConnectComplete.

Надо заметить, что многие компоненты ADO при активизации или выполнении отрабатывают команду на языке SQL. Это такие компоненты, как ADOCommand, ADODataSet, ADOTable, ADOQuery и ADOStoredProc. Для асинхронного выполнения команды установите в свойстве ExecuteOptions значение coAsyncExecute.
При выполнении команды будет происходить следующее:
  • вызовется обработчик события OnWillExecute;
  • управление передастся программе.
После окончания выполнения команды, как успешного, так и ошибочного, вызывается обработчик события OnExecuteComplete.

Асинхронная выборка данных поддерживается в компонентах ADODataSet, ADOTable, ADOQuery и ADOStoredProc. Для ее включения установите в свойстве ExecuteOptions значение coAsyncFetch.
После исполнения команды происходит передача данных. В процессе передачи многократно вызывается обработчик сообщения OnFetchProgress. В его параметрах указывается как количество уже переданных записей, так и общее количество предназначенных для передачи записей. Это очень удобно для создания индикаторов типа ProgressBar. После того как выборка с сервера закончена, вызывается обработчик события OnFetchCompiete.

В заключение создадим простое приложение, которое будет содержать только одну таблицу. Итак, в форме разместим трикомпонента с палитры компонентов:
  • ADOTable закладки ADO;
  • DataSource закладки Data Access;
  • DBGrid закладки Data Controls.
Свяжем эти компоненты между собой. Для этого установим значение свойства DataSource компонента DBGrid1 в DataSource1. Вторым шагом значение свойства DataSet компонента DataSource1 установим в ADOTable1. Все три компонента теперь - связаны. Осталось указать базу данных — в свойстве ConnectionString компонента ADOTable1 нажмем кнопку с многоточием. Появится диалоговое окно редактора параметров соединения (рис. 12.3).
Данное окно предоставляет вам право решать, каким образом будет указана строка связи с базой данных, расположенной на сервере. Один из вариантов — интерактивный ввод строки в поле Use Connection String. Кроме того, можно использовать заранее подготовленный файл, содержащий такую строку связи (Use Data Link File). Установим переключатель в положение Use Data Link File и нажмем кнопку Browse. В открывшемся окне выбора файлов связи с данными выберем файл DBDEMOS.UDL (рис. 12.4).
 
Рис 12.3. Окно редактора параметров соединения 

Технология ADO в Delphi

Рис 12.4. Окно выбора файлов связи с данными

Технология ADO в Delphi

Этот файл входит в дистрибутив Delphi и указывает на базу данных формата Microsoft Access, которая также поставляется вместе с Delphi. Нажмем кнопку Открыть, и в поле Use Data Link File появится строка C:\Program Files\Common Files\SYSTEM\ole db\Data Links\DBDEMOS.udl.

 

Нажимаем OK — база данных выбрана. Теперь осталось определить таблицубазы данных. Для этого в свойстве TableName компонента ADOTablel указываем, например, таблицу COUNTRY. Наконец, мы можем активировать набор данных — присвоим свойству Active компонента ADOTablel значение true. Все, приложение готово, и его можно запускать.

������� ������ ��� dle ������� ��������� ������

Помоги проекту! Расскажи друзьям об этом сайте: