Доступ
к связанным наборам данных и командам ADO
Компонент TADOconnection обеспечивает доступ ко всем компонентам, которые используют его для доступа к хранилищу данных ADO. Все открытые таким образом наборы данных доступны через индексированное свойство
property DataSets[Index: Integer]: TCustomADODataSet;
Каждый элемент этого списка содержит дескриптор компонента доступа к данным ADO (тип
TCustomADODataSet). Общее число связанных компонентов с наборами данных возвращается свойством
property DataSetCount: Integer;
Для этих компонентов можно централизованно установить тип используемого курсора при помощи свойства
type TCursorLocation = (clUseServer, clUseClient); property CursorLocation: TCursorLocation;
Значение clUseClient задает локальный курсор на стороне клиента, что позволяет выполнять любые операции с данными, в том числе не поддерживаемые сервером.
Значение cIUseServer задает курсор на сервере, который реализует только возможности сервера, но обеспечивает быструю обработку больших массивов данных.
Например:
for i := 0 to ADOConnection.DataSetCount — 1 do
begin
if ADOConnection.DataSets[i].Active = True then ADOConnection.DataSets[i].Close;
ADOConnection.DataSets[i].CursorLocation := clUseClient; end;
Помимо наборов данных компонент TADOConnection обеспечивает выполнение команд ADO. Команду ADO инкапсулирует специальный компонент
TADOCommand, который рассматривается ниже. Все команды ADO, работающие с хранилищем данных через это соединение, доступны для управления через индексированное свойство
property Commands[Index: Integer]: TADOCommand
Каждый элемент этого списка представляет собой экземпляр класса
TADOCommand.
Общее число доступных команд возвращается свойством
property CommandCount: Integer
Например, сразу после открытия соединения можно выполнить все связанные команды ADO, реализовав таким образом нечто вроде скрипта:
procedure TForml.ADOConnectionConnectComplete(Connection: TADOConnection;
const Error: Error; var EventStatus: TEventStatus);
var i, ErrorCnt: Integer;
begin
if EventStatus = esOK then
for i := 0 to ADOConnection.CommandCount — 1 do
try if ADOConnection.Commands[i].CommandText <>
then ADOConnection.Commands[i].Execute; except
on E: Exception do Inc(ErrorCnt);
end;
end;
Однако компонент TADOConnection может выполнять команды ADO самостоятельно, без помощи других компонентов. Для этого используется перегружаемый метод
function Execute(const CommandText: WideString; ExecuteOptions:
TExecuteOptions = []): _RecordSet; overload;
procedure Execute(const CommandText: WideString;
var RecordsAffected:
Integer; ExecuteOptions: TExecuteOptions = [eoExecuteNoRecords]);
overload;
Выполнение команды осуществляется процедурой
Execute (если команда не возвращает набор записей) или одноименной функцией
Execute (если команда возвращает набор записей).
Параметр commandText должен содержать текст команды. Параметр
RecordsAffected возвращает число обработанных командой записей (если они есть). Параметр
type
TExecuteOption = (eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking, eoExecuteNoRecords);
TExecuteOptions = set of TExecuteOption;
задает условия выполнения команды:
- eoAsyncExecute
— команда выполняется асинхронно (соединение не будет ожидать окончания выполнения
команды, а продолжит работу, обработав сигнал о завершении команды, когда
он поступит);
- eoAsyncFetch — команда
получает необходимые записи также асинхронно;
- eoAsyncFetchNonBlocking
— команда получает необходимые записи также асинхронно, но при этом созданная
нить не блокируется;
- eoExecuteNoRecords — команда
не должна возвращать записи.
Если источник данных принял команду для выполнения и сообщил об этом соединению, вызывается метод-обработчик
TWillExecuteEvent = procedure(Connection: TADOConnection;
var CommandText: WideString; var CursorType: TCursorType; var LockType:
TADOLockType; var ExecuteOptions: TExecuteOptions;
var EventStatus:
TEventStatus; const Command: _Command;
const Recordset: _Recordset)
of object;
property OnWillExecute: TWillExecuteEvent;
После выполнения команды вызывается метод-обработчик
TExecuteCompleteEvent = procedure(Connection: TADOConnection; RecordsAffected: Integer;
const Error: Error; var EventStatus: TEventStatus;
const Command: _Command;
const Recordset: _Recordset) of object;
property OnExecuteComplete: TExecuteCompleteEvent;
|