Открытие соединения с сервером БД осуществляется заданием свойству Connected типа boolean значения True. Например, при выполнении приложения это можно сделать с помощью кода:
SQLConnectionl.Connected:= True;
Соответственно закрыть соединение с сервером можно путем задания этому свойству значения False. Названные операции могут быть выполнены также с помощью методов:
procedure Open; procedure Close;
С помощью свойства LoginProm.pt типа boolean выполняется задание необходимости (True) или ненужности (False) отображения окна авторизации для ввода имени пользователя (user_Name) и пароля (Password) при каждой попытке соединения с сервером. В последнем случае эти значения будут браться из файла dbxconnections.ini.
После открытия соединения все компоненты dbExpress, инкапсулирующие наборы данных и связанные с открытым компонентом SQLConnection, получают доступ к базе данных.
При открытии и закрытии соединения можно воспользоваться любым из доступных событий, например:
property AfterConnect: TNotifyEvent; property AfterDisconnect: TNotifyEvent; property BeforeConnect: TNotifyEvent; property BeforeDisconnect: TNotifyEvent; property OnLogin: TSQLConnectionLoginEvent;
Последнее событие наступает в случае, если свойству LoginPrompt установлено значение True. Если это свойство имеет значение True, и нет обработки события OnLogin, то пользователю будет предложен стандартный диалог авторизации.
Текущее состояние соединения указывает Connectionstate типа TConnectionstate, тип которого описан так:
TConnectionstate = (csStateClosed, csStateOpen, csStateConnecting, csStateExecuting, csStateFetching, csStateDisconnecting);
Указанные в определении типа значения соответствуют следующим состояниям соединения: закрыто, открыто, установление соединения, ожидание исполнения переданного SQL-запроса, получение данных с сервера, завершение соединения.
Глава 9. Технология dbExpress
|
271
Компонент SQLConnection позволяет выполнять SQL-запросы с помощью следующих функций.
Функция Execute(const SQL: string; Params: TParams; ResultSet: Pointer = Nil): integer; выполняет запрос, определенный значением константы sql с параметрами Params, используемыми в SQL-запросе. Используемые в запросе параметры должны иметь тот же порядок следования, что и в Params и в инструкции SQL. Если SQL-запрос не содержит параметров, то свойству Params требуется задать значение Nil. Если при выполнении SQL-запроса возвращается результат, то в параметр ResultSet помещается указатель на объект типа TCustomSQLDataSet, содержащий результат.
При отсутствии в запросе параметров и возвращаемых записей рекомендуется использовать функцию ExecuteDirect(const SQL: string): Integer;, которая возвращает значение 0 при успешном завершении запроса или код ошибки в противном случае.
Подобно своим аналогам в BDE (см. главу 7) компонент SQLConnection позволяет выполнять запуск, фиксацию и откат транзакций соответственно с помощью методов: StartTransaction, Commit И Rollback.
Компоненты доступа к данным
Как отмечалось, ряд компонентов доступа к данным по технологии dbExpress (SQLDataSet, SQLQuery, SQLStoredProc и SQLTable) принадлежит к однонаправленным наборам данных, в которых отсутствует буферизация и при этом на них накладываются заметные ограничения.
В однонаправленных наборах данных используются однонаправленные курсоры. С их помощью допускается только получать данные, из методов навигации по набору данных поддерживаются лишь методы First и Next, подразумевающие последовательный перебор записей от начала к концу.
При использовании однонаправленных наборов данных отсутствует возможность прямого редактирования данных, т. к. для этого нужно размещение в буфере результатов редактирования. При этом соответствующее свойство названных компонентов (canModify) всегда имеет значение False. Для однонаправленных наборов данных возможности редактирования данных все же доступны, например, путем задания оператора update языка SQL. Кроме того, для однонаправленных наборов данных по тем же причинам имеют место ограничения по выполнению фильтрации. Это ограничение также можно обойти путем указания параметров фильтрации в SQL-запросах.
|
Имеются также ограничения по отображению данных с помощью компонентов страницы Data Controls. В частности, нельзя использовать компоненты DBGrid и DBCtrlGrid, а также компоненты синхронного просмотра. Для компонента навигатора требуется отключить кнопки возврата на последнюю запись и перехода на последнюю запись. Остальные компоненты можно использовать как обычно.
272 Часть II. Технологии доступа к данным
Для компонента simpleDataSet большинство из указанных ограничений не действует. Он использует внутренние компоненты типа TSQLDataSet и TDataSetProvider для получения и изменения данных.
Перед использованием любой из указанных компонентов доступа к данным следует подключить к серверу БД. Для этого достаточно его свойству SQLConnection в качестве значения установить имя компонента соединения
SQLConection.
Компоненты доступа к данным можно использовать, поместив в форме, либо динамически — создав при выполнении приложения.
Универсальный доступ к данным
Для обеспечения универсального однонаправленного доступа к данным БД по технологии dbExpress служит компонент SQLDataSet. Он позволяет получать все записи из таблицы БД, производить выборку данных путем выполнения SQL-запросов или выполнять хранимые процедуры.
|
Для определения типа выполняемых действий (с запросами, таблицами или хранимыми процедурами) свойству CommandType рассматриваемого компонента нужно установить соответственно одно из трех возможных значений:
□ ctQuery — в свойстве CommandText указывается SQL-запрос;
□ ctTable — в свойстве CommandText указывается имя таблицы на сервере БД, при этом компонент автоматически генерирует SQL-запрос для получения всех записей для всех полей таблицы;
□ ctstoredProc — в свойстве CommandText указывается имя хранимой процедуры.
В случае выбора значения ctQuery текст SQL-запроса можно ввести в поле свойства CommandText с помощью Инспектора объектов или редактора построения запроса commandTextEditor (рис. 9.3). В списке Tables доступны имена таблиц в базе данных, а в списке Fields — имена полей выбранной таблицы. С помощью кнопок Add Table to SQL и Add Field to SQL можно добавить нужные таблицы и поля. При этом в поле SQL отображается автоматически сформированный SQL-запрос. После нажатия ОК в окне редактора мы получаем нужное значение свойства CommandText.
При выполнении приложения аналогичные действия (как на рис. 9.3) для выполнения SQL-запроса можно задать так:
SQLDataSetl.CommandType:= ctQuery;
SQLDataSetl.CommandText:= 'select COUNTRY, CURRENCY from DEPARTMENT, DEPT_NO, DEPARTMENT from COUNTRY ';
SQLDataSetl.ExecSQL;
Глава 9. Технология dbExpress
273
При выборе значения ctTable в свойстве CommandText указывается просто имя таблицы, например, так:
SQLDataSetl.CommandType:= ctTable; SQLDataSetl.CommandText: = 'COUNTRY'; SQLDataSetl.ExecSQL;
Для открытия набора данных нужно установить значение True свойству Active или использовать метод open. Если же SQL-запрос или хранимая процедура не возвращают набор данных, для их выполнения используется метод
function ExecSQL(ExecDirect: Boolean = False): Integer; override;
Параметр ExecDirect определяет необходимость подготовки параметров перед выполнением инструкции. Если параметры запроса или процедуры существуют, параметр ExecDirect должен иметь значение False.
При необходимости сортировки данных используют инструкцию order by в случае варианта ctQuery, либо устанавливают с помощью редактора SortFields Editor значение свойства sortFieidNames в случае варианта ctTable. Для варианта ctstoredProc порядок сортировки определяется в хранимой процедуре.
При необходимости в SQL-запросе или в хранимой процедуре можно использовать параметры, позволяющие настраивать запрос или процедуру, не изменяя их код (см. главу 8). Параметры задаются с помощью свойства Pa rams, которое является коллекцией объектов типа т Pa ram.
Свойство DataSource типа TDataSource компонента SQLDataSet позволяет связать два набора данных по схеме "мастер-детальный" (см. главу 2).
Метод Setschemainfo компонента SQLDataSet позволяет получить метаданные (список таблиц на сервере, список системных таблиц, информация о хранимых процедурах, информация о полях таблицы, параметры хранимой процедуры).
274
Часть II. Технологии доступа к данным
Рассмотрим пример формы (рис. 9.4) приложения БД, в котором с помощью компонентов SQLDataSet выполняется доступ к данным по технологии dbExpress. Пусть требуется обеспечить возможность просмотра и редактирования полей данных 'cust_no', 'customer' и 'phone_no' таблицы customer, принадлежащей базе данных EMPLOYEE.GDB сервера InterBase.
Рис. 9.4. Вид формы при разработке
Код модуля формы для решения поставленной задачи имеет вид:
unit UnitSQLDataSet;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBXpress, FMTBcd, DB, SqlExpr, StdCtrls, Mask, DBCtrls;
type
TForml = class(TForm)
SQLConnectionl: TSQLConnection; SQLDataSetl: TSQLDataSet; DataSourcel: TDataSource; Labell: TLabel; Label2: TLabel; Buttonl: TButton; Button2: TButton; Button3: TButton;
Глава 9. Технология dbExpress
275
SQLQueryl: TSQLQuery;
SQLDataSet2: TSQLDataSet;
Editl: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure SQLDataSetlAfterScroll(DataSet: TDataSet);
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
Forml: TForml;
implementation
{$R *.dfm}
procedure TForml.SQLDataSetlAfterScroll(DataSet: TDataSet);
begin
Editl.Text:=SQLDataSetl.FieldByName('CUST_NO').AsString;
Edit2.Text:=SQLDataSetl.FieldByName('CUSTOMER').AsString;
Edit3.Text:=SQLDataSetl.FieldByName('PHONE_NO').AsString;
end;
procedure TForml.ButtonlClick(Sender: TObject);
begin
SQLDataSetl.First;
end;
procedure TForml.Button2Click(Sender: TObject); begin
SQLDataSetl.Next; end;
procedure TForml.Button3Click(Sender: TObject);
begin
with SQLDataSet2 do
276
Часть II. Технологии доступа к данным
try
CommandText:= 'UPDATE CUSTOMER SET CUST_NO =:Cust_no, CUSTOMER:Customer, PHONE_NO =: Phone_no WHERE CUST_NO =:CUST_NO';
Params[0].AsString:= Editl.Text;
Params[1].AsString: = Edit2.Text;
Params[2].AsString:= Edit3.Text;
ExecSQL;
except
MessageDlg('Customer info fixed error',mtError,[mbOK],0);
end;
end;
end.
Для просмотра и редактирования трех указанных полей таблицы customer используются два компонента SQLDataSetl и SQLDataSet2 соответственно. Оба компонента подсоединены к таблице сервера InterBase через компонент SQLConnectionl. Первый компонент SQLDataSetl служит для просмотра записей таблицы customer. Второй компонент SQLDataSet2 служит для фиксации внесенных изменений (три компонента типа TEdit) в текущую запись в таблице на сервере БД.
Для заполнения компонентов типа TEdit при навигации по набору данных используется обработчик события Af teScroll для компонента SQLDataSetl. Навигация по набору данных выполняется с помощью обработчиков событий Onclick для кнопок с заголовками First и Next. Фиксация внесенных в просматриваемую запись изменений в таблице на сервере осуществляется с помощью SQL-запроса update, размещенного в обработчике события onclick для кнопки с заголовком Update. В параметрах запроса передаются текущие значения полей из компонентов Editl, Edit2 и Edit3 (рис. 9.5).
Глава 9. Технология dbExpress
277
Отметим, что необходимость использования компонента SQLDataSet2 для фиксации внесенных изменений в таблице на сервере вызвано тем, что компонент SQLDataSetl является однонаправленным набором данных. Заметим также, что в нашем примере нельзя вместо компонентов Edit использовать компоненты DBEdit, т. к. здесь они не позволяют выполнять редактирование содержимого полей.
Просмотр таблиц
Для просмотра таблиц по технологии dbExpress служит компонент SQLTabie. Компонент SQLTabie генерирует SQL-запрос для получения всех строк и полей указанной таблицы.
Имя таблицы определяется с помощью свойства TabieName, и при подключении компонента к соединению его можно выбрать в комбинированном списке в окне Инспектора объектов.
Для получения табличного набора данных компонент SQLTabie с помощью метода
procedure PrepareStatement; override; генерирует запрос на сервер БД.
Порядок следования данных в наборе определяется свойством indexFieidNames типа String ИЛИ IndexName типа String.
Список индексов таблицы можно получить с помощью метода GetmdexNames (List: TStrings) в качестве значения параметра List.
Связь между двумя наборами данных "главный-подчиненный" устанавливается с помощью свойств MasterFieids и MasterSource. На этапе разработки приложения двойным щелчком на свойстве MasterFieids в окне Инспектора объектов можно открыть диалоговое окно редактора связей для визуального построения отношения "мастер-детальный".
Компонент SQLTabie является однонаправленным курсором, тем не менее, он допускает удаление записей из таблицы на сервер БД с помощью метода
DeleteRecords.
Выполнение SQL-запроса
Для выполнения SQL-запроса на сервере БД служит компонент SQLQuery. Он позволяет представлять результаты выполнения запросов с помощью инструкции select или осуществлять действия по изменению БД путем выполнения
ИНСТРУКЦИЙ INSERT, DELETE, UPDATE, ALTER TABLE И Т. П.
Для компонента SQLQuery текст SQL-запроса определяется как значение свойства sql типа TStrings. На этапе разработки приложения текст SQL-запроса может быть набран непосредственно в окне редактора строк (или ре-
278
Часть II. Технологии доступа к данным
дактора кода), открываемого двойным щелчком на свойстве sql в окне Инспектора объектов.
При выполнении приложения очистка содержимого свойства SQL компонента SQLQuery и его модификация могут быть выполнены, к примеру, с помощью следующего кода:
SQLQueryl.SQL.Clear;
SQLQueryl.SQL.Add('SELECT ' + Editl.Text + ' FROM ' + Edit2.Text);
if Length(Edit3.Text) <> 0 then
SQLQueryl.SQL.Add('ORDER BY ' + Edit3.Text)
Свойство Text типа string в качестве значения содержит строковое представление SQL-запроса в виде одной строки, а не нескольких, как это может быть в случае свойства sql.
Свойство Active типа Boolean определяет, открыт набор данных или нет. Это свойство обычно используют, чтобы определить или установить заполнение набора данными.
Открыть набор данных SQL-запроса также можно с помощью метода Open, либо с помощью метода
function ExecSQL(ExecDirect: Boolean = False): Integer; override;
Здесь значение False параметра ExecDirect означает, что запрос не имеет настраиваемых параметров.
Свойство DataSource связывает набор данных SQL-запроса с другим (главным) набором данных. Этот набор данных используется для получения параметров запроса в случае, когда предусматривается параметризованный запрос, но приложение этими параметрами не обеспечивает.
Выполнение хранимых процедур
Для выполнения хранимых процедур, размещенных на сервере БД, служит компонент SQLStoredProc.
Имя хранимой процедуры задает свойство storedProcName типа string. Для задания параметров хранимой процедуры предназначено свойство Params типа TParams. При обращении к параметрам хранимой процедуры целесообразно использовать метод ParamByName. Это обусловлено тем, что при работе с некоторыми серверами порядок следования параметров до и после выполнения процедуры может меняться.
Для подготовки хранимой процедуры к выполнению на сервере служит метод PrepareStatement(var RecordsAffected: Integer): TCustomSQLDataSet;. При его вызове сервером БД выделяются ресурсы и связываются их параметры. Поименованные параметры временно преобразуются к непоименованным параметрам, поскольку dbExpress поименованные параметры не поддерживает.
Глава 9. Технология dbExpress
279
Если хранимая процедура не возвращает набор данных, то ее запускают с помощью метода
function ExecProc: Integer; virtual;
В противном случае используется метод Open либо свойству Active задают значение True.
Компонент редактирования набора данных
Для редактирования набора данных (получения данных, их кэширования и отправления измененных данных на сервер) предназначен компонент SimpleDataSet. Этот компонент использует двунаправленный курсор и позволяет редактировать данные, но в режиме редактирования. Тем самым он исправляет основные недостатки рассматриваемой технологии.
Для подготовки компонента SimpleDataSet к работе с данными нужно с помощью свойства Connection связать его с компонентом соединения SQLConnection. В качестве альтернативы можно с помощью подсвойства ConnectionName свойства Connection задать тип соединения непосредственно.
Произведенные над данными изменения размещаются в локальном кэше, в связи с этим для подтверждения изменений и отправки данных на сервер БД используют метод
function ApplyUpdates(MaxErrors: Integer); Integer; virtual;
Здесь параметр метода определяет число ошибок, допустимых при передаче данных.
Локальный кэш компонента после сохранения изменений на сервере можно очистить от данных с помощью метода
function Reconcile(const Results: OleVariant): Boolean;
Отмена локальных изменений данных может быть выполнена с помощью метода
procedure CancelUpdates;.
Пересылка данных между сервером и рассматриваемым компонентом осуществляется с помощью пакетов. Размер пакета (по числу записей) можно задать с помощью свойства PacketRecords типа integer. Iо умолчанию устанавливается значение — 1, которое означает, что один пакет должен содержать все записи набора данных.
Если значение свойства PacketRecords больше 0, то оно определяет число записей, которые можно получить в пакете от провайдера с помощью метода
function GetNextPacket: Integer;
Если значение свойства PacketRecords равно 0, то в пакете передаются только метаданные.
Свойство DataSize типа integer устанавливает размер (в байтах) текущего пакета, доступного с помощью свойства Data типа OleVariant.
280
Часть II. Технологии доступа к данным
На общее число записей в источнике данных указывает свойство RecordCount типа integer, номер текущей записи определяет свойство RecNo типа integer.
Изменения в текущей записи можно отменить с помощью метода
procedure RevertRecord;
Отменить последнюю операцию по изменению клиентского источника данных можно с помощью метода
function UndoLastChange(FollowChange: Boolean): Boolean;
Здесь значение параметра определяет, где будет установлен курсор после восстановления записи: True — на восстановленной записи, False — на текущей записи.
Обновить значение полей для текущей записи с сервера можно с помощью метода RefreshRecord.
Рассмотрим пример формы (рис. 9.5) приложения БД, в котором с помощью компонента simpieDataSeti выполняется доступ к данным по технологии dbExpress. Пусть требуется обеспечить возможность просмотра и редактирования записей таблицы department, принадлежащей базе данных EMPLOYEE.GDB сервера InterBase.
Код модуля формы для решения поставленной задачи имеет вид:
unit UnitSimpleDataSet;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, FMTBcd, DBXpress, DB, SqlExpr, ExtCtrls, DBCtrls, Grids,
DBGrids, DBClient, SimpleDS;
Глава 9. Технология dbExpress
281
type
TForml = class(TForm)
SimpleDataSetl: TSimpleDataSet;
SQLConnectionl: TSQLConnection;
DBGridl: TDBGrid;
DataSourcel: TDataSource;
DBNavigatorl: TDBNavigator;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure SimpleDataSetlAfterPost(DataSet: TDataSet); private
{ Private declarations } public
{ Public declarations } end;
var
Forml: TForml;
implementation
{$R *.dfm}
procedure TForml.FormCreate(Sender: TObject);
begin
SimpleDataSetl.Open;
end;
procedure TForml.FormDestroy(Sender: TObject); begin
SimpleDataSetl.Active:=False; end;
procedure TForml.SimpleDataSetlAfterPost(DataSet: TDataSet); begin
SimpleDataSetl.ApplyUpdates(-1); end; end.
Dомпонент SimpleDataSetl работает в табличном режиме. При разработке формы подсвойству commandType свойства DataSet задано значение ctTabie, с помощью подсвойства commandText указано имя таблицы department.
282
Часть II. Технологии доступа к данным
Для отображения записей редактируемого набора данных и навигации по нему
ИСПОЛЬЗУЮТСЯ КОМПОНеНТЫDBGridl И DBNavigatorl Соответственно. ФиКСЭЦИЯ
внесенных при редактировании изменений и отправка данных на сервер осуществляются в обработчике события After Post, возникающего при нажатии кнопки Post (утвердить результат изменения записи) компонента DBNavigatorl и при переходе в компоненте DBGridl на другую строку (см. главу 6).
Отладка соединения с сервером
Для получения информации о местах ошибок в SQL-запросах при отладке соединения приложения с сервером БД служит компонент SQLMonitor. Он осуществляет перехват сообщений между соединением и сервером баз данных и помещает ИХ В СПИСОК СТрОК, определяемый СВОЙСТВОМ TraceList ТИПа TStrings.
Для начала работы с компонентом нужно установить связь с соединением через свойство SQLConnection и активизировать его, задав свойству Active значение
True.
Перед каждой записью сообщений в список строк возникает событие оптгасе типа
TTraceEvent = procedure(Sender: TObject; CBInfo: pSQLTRACEDesc; var LogTrace: Boolean) of object;
а сразу после записи в список возникает событие onLogTrace типа
TTraceLogEvent = procedure (Sender: TObject; CBInfo: pSQLTRACEDesc) of object;
Содержимое списка можно сохранить в файле на жестком диске с помощью
метода SaveToFile.
При задании свойству AutoSave типа Boolean значения True данные о проходящих командах автоматически заносятся в текстовый файл с именем, заданным значением свойства FileName типа string.
Свойство MaxTraceCount типа integer определяет максимальное число контролируемых команд, а также управляет процессом контроля. При значении — 1 ограничения снимаются, а при значении 0 контроль не выполняется.
На число сохраненных в списке команд указывает свойство TraceCount типа Integer.
Рассмотрим следующий пример: пусть требуется выполнять оперативное отображение информации о последнем сообщении в окне многострочного редактора (компонент memol).
Для решения названной задачи подходит следующий код:
procedure TForml.SQLMonitorlLogTrace(Sender: TObject; CBInfo: pSQLTRACEDesc); var LogFileName: string;
Глава 9. Технология dbExpress
283
begin
with Sender as TSQLMonitor do begin
memol.Lines.Clear;
memol.Lines:=TraceList;
TraceList.Clear; {очистка списка сообщений} end;
end;
Как видно из приведенного кода, мы использовали обработчик события
OnLogin.
(_____ ЗамечаниеJ
Для автономного dbExpress-приложения нужны две динамически подключаемые библиотеки (DLL). Первая библиотека содержит драйвер dbExpress, например, для сервера БД InterBase это dbexpint.dll (см. табл. 9.1). Вторая библиотека есть midas.dll, используемая для поддержки компонента SimpleDataSet. Обе библиотеки могут быть откомпилированы вместе с проектом и включены в ехе-файл распространяемого приложения.
При использовании компонента SimpleDataSet в приложении Delphi может возникать ошибка, сопровождаемая сообщением: "Error loading Midas.dll". Возможной причиной ее появления является неправильная регистрация названной библиотеки в среде операционной системы. Для выполнения регистрации библиотеки Midas.dll с целью устранения этой ошибки при работе под управлением Windows 2000 достаточно запустить на выполнение утилиту regsvr32.exe. Обычно она размещается в системном каталоге Windows, например, \winnt\system32.
Глава 10
ТехнологияADO
Общая характеристика
Технология Microsoft ActiveX Data Objects (ADO) представляет собой универсальный механизм доступа к различным источникам данных из приложений баз данных. Основу технологии ADO составляет использование набора интерфейсов общей модели объектов СОМ, описанных в спецификации OLE DB. Достоинством этой технологии является то, что базовый набор интерфейсов OLE DB имеется в каждой современной операционной системе Microsoft. Отсюда следует простота обеспечения доступа приложения к данным. При применении технологии ADO (рис. 10.1) приложение БД может использовать данные из электронных таблиц, таблиц локальных и серверных баз данных, XML-файлов и т. д.
В соответствии с терминологией ADO, любой источник данных (базу данных, файл, электронную таблицу) называют хранилищем данных. Приложение взаимодействует с хранилищем данных с помощью провайдера. Для каждого типа хранилища данных используется свой провайдер ADO. Провайдер обеспечивает обращение к данным хранилища с запросами, интерпретацию возвращаемой служебной информации и результатов выполнения запросов для передачи их приложению.
Все объекты и интерфейсы ADO являются объектами и интерфейсами СОМ. Согласно спецификации OLE DB, в состав СОМ входит следующий набор объектов:
□ Command (команда) — служит для обработки команд (обычно SQL-запросов);
□ Data Source (источник данных) — используется для связи с провайдером данных;
Глава 10. Технология ADO
285
П Enumerator (перечислитель) — служит для перечисления провайдеров ADO;
□ Error (ошибка) — содержит информацию об исключениях;
□ Rowset (набор рядов) — строки данных, являющиеся результатом выполнения команды;
□ Session (сессия) — совокупность объектов, обращающихся к одному хранилищу данных;
□ Transaction (транзакция) — управление транзакциями в OLE DB.
Мы привели состав объектов СОМ, чтобы получить общую картину о технологии ADO. В Delphi некоторые из этих объектов получили реализацию, и при необходимости мы будем рассматривать более подробно отдельные понятия.
В системе программирования Delphi компоненты, используемые для создания приложений по технологии ADO, расположены на странице ADO Палитры компонентов (см. главу 2). Охарактеризуем кратко назначение этих компонентов:
□ ADOConnection — ADO-соединение, используется для установки соединения с ADO-источником данных и обеспечивает поддержку транзакций;
□ ADOCommand — ADO-команды, используется для выполнения SQL-команд доступа к ADO-источнику данных без возвращения результирующего набора данных;
□ ADODataSet — набор данных ADO, обеспечивает доступ к одной или более таблице ADO-источника данных и позволяет другим компонентам управлять этими данными, связываясь с компонентом ADOTable через компонент DataSource аналогично тому как используется компонет DataSet. Может
использоваться в компонентах ADOTable, ADOQuery, ADOStoredProc;
□ ADOTable — таблица ADO, обеспечивает доступ к одной таблице ADO-источника данных и позволяет другим компонентам управлять этими данными, связываясь с компонентом ADOTable через компонент DataSource;