СТАТЬЯ 17.07.01

Компоненты ADO

Предыдущая часть

Дмитрий Ю. Сидоров

Простейшее приложение

Рис 7

Теперь нам необходимо указать базу данных. Делается это в свойстве ConnectionString компонента TADOTable. При нажатии на кнопку “” появится редактор параметров соединения. Отметим радокнопку “Use data link file”, нажмите на кнопку “Browse…” и выберите в появившемся окне после файл линка к базе данных “\Program Files\Common Files\System\ole db\Data Links\DBDEMOS.UDL”. Этот линк указывает на базу в формате MS Access, входящую в поставку Delphi.

После этого в свойстве TableName компонента TADOTable выберем таблицу customer.

Активизируем компонента TADOTable, установив свойство Active в True.

Приложение можно запускать. Этот пример можно найти в директории Simple.

Обзор ADO

ADO основано на технологии COM. Все объекты и интерфейсы ADO являются интерфейсами и объектами COM.

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

Интерфейс Connection

Объекты этого типа выполняют следующие функции:

Рис 9. Схема взаимодействия в ADO основных COM интерфейсов

Интерфейсы Recordset и Field

Интерфейс Recordset (на нижнем уровне ADO это IRowset) является аналогом TDataSet в Delphi.

Поддерживает текущее положение и перемещение курсора, закладки (bookmarks), чтение, изменение и удаление записей и так далее. Значение полей и их типы доступны с помощью свойства Fields.

Интерфейс Field позволяет получать значение поля, его тип длину и так далее.

Интерфейсы Command и Parameter

Эти два типа позволяют работать с командами источника данных. Синтаксис команд для каждого из источников свой.

Интерфейс Property

Все объекты, кроме Parameter, имеют свойство Properties, которое позволяет получать и устанавливать параметры специфические для провайдера данных.

Библиотека довольно запутанная, многие функции дублированы в разных объектах. Например, Recordset можно создавать напрямую, методом Open, (причем предварительно создавать Connection не обязательно), можно получить как результат выполнения метода Command.Execute, либо после Connection.Execute задав команду без параметров.

Интерфейс Command инкапсулирован во все компоненты за исключением TADOConnection. Это сделано потому, что в ADO нет возможности получить данные не выполнив команду.

Интерфейс Recordset инкапсулирован в компоненты производные от TCustomADODataSet. Это компоненты TADODataSet, TADOTable, TADOQuery, TADOStoredProc.Получать данные из них возможно штатными средствами Delphi.

Возможно получение данных и при выполнении компонента TADOCommand. Метод этого компонента Execute возвращает тип _Recordset. После чего его можно, например, связать с компонентом TADODataSet следующим образом

ADODataSet1.RecordSet := ADOCommand1.Execute;

Компоненты TADOTable, TADOQuery и TADOStoredProc являются частными случаями команды, соответственно для таблицы, SQL запроса и хранимой процедуры.

Тип Connection инкапсулируется в компонент TADOConnection.

Когда вы выполняете команду предварительно не открывая соединение, оно все равно создается. Получить к нему доступ возможно через свойство Recordset. Привязать компонент TADOConnection к уже открытому соединению возможно через свойство ConnectionObject.

Информацию о структуре базы данных можно получить с помощью метода OpenSchema компонента TADOConnection. Эта информация представлена как набор таблиц, как стандартизованных, так и специфических для провайдера. Таким способом можно узнать список таблиц, запросов, хранимых процедур и многое другое. Однако изменять структуру базы с помощью возвращаемых наборов данных невозможно.

Пример использования TADOConnection

В этом примере рассматривается работа с компонентом TADOConnection, SQL запросами с параметрами и трансакциями.

Создадим приложение из следующих компонентов

Рис 10. Master-detail форма на этапе дизайна

Связываем MasterGrid, MasterDS,MasterSQL и DetailGrid,DetailDS,DetailSQL аналогично предыдущему примеру, за исключением того, что вместо типа TADOTable используется тип TADODataSet.

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

Для ввода SQL запросов необходимо отредактировать свойство CommandText компонентах MasterSQL и DetailSQL. После нажатия на кнопку “” появится редактор компонент, который выглядит следующим образом

Рис. 10

Кнопка “Add Table to SQL” добавляет в текст SQL запроса таблицу, выбранную в списке “Tables”, а “Add Field to SQL” поле таблицы, выбранное в списке “Fields”.

Запрос для MasterSQL

select VendorNo, VendorName, Country, City, State, Preferred 
from vendors 

Запрос в DetailSQL должен выбирать только те детали, поставщик которых является текущим в MasterSQL. Для этого установим свойство DataSource компонента DetailSQL в значение MasterDS.

Запрос для DetailSQL следующий:

select PartNo, OnOrder, OnHand, ListPrice, Description, Cost
from parts
where VendorNo = :VendorNo 

:VendorNo в части where – параметр запроса. Параметры при установленном DataSource берутся из него.

Активизируем MasterSQL и DetailSQL аналогично предыдущему примеру.

Приложение можно запускать. Этот пример можно найти в директории MasterDetail.

Пример использования параметров запроса

Теперь ограничим выборку поставщиков по значению поляState. Для этого добавим к форме следующие компоненты StateEdit типа TEdit c вкладки Standard, QueryButton типа TButton c вкладки Standard

Изменим запрос в MasterSQL на

select VendorNo, VendorName, Country, City, State, Preferred
from vendors
where State = :StateID 

:StateID – параметр, вместо которого при выполнении подставляется значение.

Добавим так же обработчик события OnClick в QueryButton следующего содержания

procedure TForm1.QueryButtonClick(Sender: TObject);
begin
 MasterSQL.Active := False;
 DetailSQL.Active := False;
 MasterSQL.Parameters.ParamByName('StateID').Value := StateEdit.Text;
 MasterSQL.Active := True;
 DetailSQL.Active := True;
end; 

Программа готова. Этот пример можно найти в директории Param.

Синхронизация данных клиента и сервера.

В ADO используются три метода синхронизации данных на клиенте и сервере.

Этих методы доступны во всех компонентах имеющих набор данных. Однако эти функции доступны не для всех баз данных.

Продолжение статьи

Дополнительную информацию Вы можете получить в компании Interface Ltd.

Отправить ссылку на страницу по e-mail
Обсудить на форуме Inprise/Borland


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 17.07.01