|
Доступ к связанным наборам данных и командам 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;
|