Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание САПР на базе продуктов Autodesk


Информационный Канал Subscribe.Ru


Информационная рассылка сайта [CadDev.Narod.Ru]

(с) 2004, Калугин Сергей Сергеевич

По просьбам активистов ...(окончание)

Сегодняшняя рассылка завершает рассмотрение вопросов интеграции приложений, что относится к некторым подсистемам САПР.

В этом номере:


Компоненты ADO. Часть III

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

Работа с транзакциями

В компонентах ADO работа с транзакциями осуществляется через компонент TADOConnection.

Тип транзакции устанавливается в свойстве IsolationLevel одной из следующих констант:

IlUnspecified

Сервер будет использовать лучший, по его мнению, тип изоляции.

IlChaos

Транзакции с более высоким уровнем изоляции не могут изменять данные измененные, но не подтвержденные в текущей транзакции.

IlReadUncommitted

Чтение данных измененных в не подтвержденных транзакций. То есть изменения видны сразу после того как другая транзакция передала их на сервер.

IlBrowse

То же самое что и IlReadUncommitted

IlReadCommitted

Чтение данных измененных подтвержденными транзакциями. То есть изменение данных будет видимо после выполнения Commit в другой транзакции.

IlCursorStability

Тожесамоечтои IlCursorStability.

IlRepeatableRead

Изменения, сделанные другими транзакциями не видимы, но при выполнении перезапроса они транзакция может получать новый набор данных.

IlIsolated

Транзакция не видит изменений данных произведенных другими транзакциями.

IlSerializable

То же самое что и IlIsolated.

Обратите внимание на то, что не все типы провайдеров данных поддерживают все типы изоляции или работу с транзакциями.

Свойство Attributes устанавливает открывать ли новую транзакцию автоматически

  • xaCommitRetaining – при подтверждении транзакции
  • xaAbortRetaining – при отмене транзакции

Так же у компонента TADOConnection есть три метода для работы с транзакциями:

  • BeginTrans Начинает транзакцию
  • CommitTrans Подтверждает сделанные изменения
  • RollbackTrans Откатывает транзакцию.

Пример работы с транзакциями

За базовый возьмем пример использования TADOConnection.

Добавим к форме две кнопки (StCmButton и RollbackButton) типа TButton, обработчики событий OnClick этих кнопок, процедуру fix_controls без параметров к форме, обработчик события OnActivate формы

type TForm1 = class(TForm)
 …
 private
 procedure fix_controls;
 …
procedure TForm1.fix_controls;
begin
 if Connection.InTransaction then
 begin
    StCmButton.Caption := 'Commit';
    RollbackButton.Enabled := True;
 end
else
 begin
    StCmButton.Caption := 'Begin';
    RollbackButton.Enabled := False;
 end;
 MasterSQL.Requery;
 DetailSQL.Requery;
end;

procedure TForm1.StCmButtonClick(Sender: TObject);
begin
 if not Connection.InTransaction
    then Connection.BeginTrans
    else Connection.CommitTrans;
 fix_controls;
end;

procedure TForm1.RollbackButtonClick(Sender: TObject);
begin
 Connection.RollbackTrans;
 fix_controls;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 fix_controls;
end;

Программу можно запускать. Этот пример находится в директории Trans.

Обратите внимание на то, что когда транзакция не запущена, все равно можно изменять данные и они записываются немедленно.

Доступ к данным

В отличие от BDE, ADO поддерживает больше настроек работы данных.

В ADO есть понятие набора данных (recordset) и тесно связанное с ним понятие курсора (cursor). Что такое курсор в документации на ADO не описано. Однако почему то месторасположение набора данных называется положением курсора. Я думаю, что это терминологическая путаница в Microsoft и курсор то же самое что набор данных.

Во всех компонентах имеющих набор данных (то есть в TADODataSet, TADOTable, TADOQuery, TADOStoredProc) есть свойства CursorLocation, CursorType, LockType и MarshalOptions, устанавливающие параметры обмена с сервером. Все эти свойства должны быть установлены до того, как набор данных открывается. Если вы установите их позже, то эффекта не будет.

CursorLocation – определяет, где выполняется работа с набором на клиенте (clUseClient) или на сервере (clUseServer). Если набор данных расположен на клиенте, то с сервера данные запрашиваются однократно (или до выполнения повторного запроса), в дальнейшем вся выборка данных и позиционирование идет на клиенте. Однако модификация данных производится немедленно.

CursorType – устанавливает тип курсора. Значение одно из:

  • ctUnspecified – библиотека ADO сама определяет оптимальный тип блокировки.
  • ctStatic – статический курсор. Статическая копия набора записей, которую вы можете использовать, например, для генерации отчета. Добавления, изменения или удаление записей другими пользователями не видимы.
  • сtOpenForwardOnly – идентичен статическому курсору, за исключением того, что вы можете переходить только вперед. Это тип улучшает эффективность в ситуациях, когда вы делаете только один проход через набор данных.
  • ctDynamic – динамический курсор. Добавления, изменения и удаление другими пользователями видимы и возможны все типы передвижения по набору данных. Закладки (bookmarks) возможны только, если провайдер данных их поддерживает.
  • ctKeyset – курсор набора данных. Аналогичен динамическому курсору, за исключением того, что вы не увидите записи добавленные другими пользователями, а записи удаленные другими пользователями недоступны из вашего набора данных. Изменения данных другими пользователями видимы.

Надо заметить, что TDBGrid и другие компоненты, одновременно работающие с несколькими записями, могут работать только когда закладки поддерживаются. Поэтому для компонент с которыми вы будите связывать такие компоненты должны использоваться типы ctKeyset или ctDynamic.

LockType – определяет тип блокировки записей в наборе данных. Оно из:

  • ltUnspecified – библиотека ADO сама определяет какой тип будет использоваться.
  • ltReadOnly – только чтение, изменение данных невозможно.
  • ltPessimistic – пессимистическая блокировка. Запись блокируется сразу после начала редактирования и до сохранения записей.
  • ltOptimistic – оптимистическая блокировка. Запись блокируется только когда изменения сохраняются.
  • ltBatchOptimistic – тоже самое что и ltOptimistic, но используется отложенное сохранение изменений записей. Более подробно она рассматривается в следующем пункте.
  • MarshalOptions – это свойство определяет будут ли отправлены на сервер те поля, которые не были изменены. При значении moMarshalAll будут, а при moMarshalModifiedOnly не будут.

Работа с отложенными изменениями

Обратите внимание, что в компонентах ADO нет свойства CachedUpdates, но это не означает, что невозможно отложить передачу изменений данных на сервер. Эта возможность встроена с ADO и называется Batch Updates.

Для ее использования необходимо использовать клиентский курсор (то есть установить свойство CursorLocation в clUseClient) и LockType в ltBatchOptimistic

Так же есть метод сохраняющий изменения UpdateBatch и метод их отменяющий CancelBatch.

К каким записям из набора данных применяется действие зависит от единственного параметра этих функций

arCurrent – текущая запись

arFiltered – записи, которые попали в фильтрацию.

arAll – все записи набора.

Пример работы с отложенными изменениями.

  • За основу возьмем пример работы с транзакциями.
  • Добавим компоненты
  • BatchCB типа TCheckBox
  • ApplyButton типа TButton
  • CancelButton типа TButton
  • Добавим обработчики событий OnClick во все эти три компонента.
  • Изменим обработчик события OnActivate формы.

procedure TForm1.FormActivate(Sender: TObject);
begin
    fix_controls;
    ApplyButton.Visible  := BatchCB.State = cbChecked;
    CancelButton.Visible := BatchCB.State = cbChecked;
end;

procedure TForm1.BatchCBClick(Sender: TObject);
begin
    MasterSQL.Close;
    DetailSQL.Close;
    if BatchCB.State = cbChecked then
      begin
         MasterSQL.LockType := ltBatchOptimistic;
         DetailSQL.LockType := ltBatchOptimistic;
      end
    else
      begin
         MasterSQL.LockType := ltOptimistic;
         DetailSQL.LockType := ltOptimistic;
      end;
    MasterSQL.Open;
    DetailSQL.Open;
    ApplyButton.Visible  := BatchCB.State = cbChecked;
    CancelButton.Visible := BatchCB.State = cbChecked;
end;

procedure TForm1.ApplyButtonClick(Sender: TObject);
begin
    MasterSQL.UpdateBatch;
    DetailSQL.UpdateBatch;
end;

procedure TForm1.CancelButtonClick(Sender: TObject);
begin
    MasterSQL.CancelBatch;
    MasterSQL.CancelBatch;
end;

События ADO

События ADO предназначены для той же цели, что и события VCL. Многие из них имеют аналогичные события VCL и компоненты вызывают из событий ADO события VCL. В компонентах доступны как события ADO, так и события BDE.

События соединения.

  • OnWillConnect – вызывается перед установкой соединения.
  • OnConnectComplete – после установки соединения.
  • OnDisconnect – при разрыве соединения.

Эти события инкапсулированы в компоненте TADOConnection.

События транзакции.

  • OnBeginTransComplete – при выполнении BeginTrans.
  • OnCommitTransComplete – привыполнении CommitTrans.
  • OnRollbackTransComplete – привыполнении RollbackTrans.

Эти события инкапсулированы в компоненте TADOConnection.

События выполнения команд

OnWillExecute и OnExecuteComplete вызываются перед и после выполнением команды.

Эти события инкапсулированы в компоненте TADOConnection, а не в компоненте TADOCommand, как можно было бы предположить. Это связано с тем, что в ADO объекта команды как такого нет и по этой причине он не может получать сообщения.

В TADOConnection также инкапсулировано событие OnInfoMessage, которое вызывается при приходе с сервера дополнительной информации. Формат и назначение зависят от сервера, с которым вы работаете.

В ADO так же есть события связанные с набором данных, а не с соединением, как вышеописанные. Они инкапсулированы в компоненты имеющие набор данных – TADODataSet, TADOTable, TADOQuery и TADOStoredProc.

Эти события можно разбить на три группы.

1) События выборки данных

  • OnFetchProgress – многократно вызывается в процессе выборки набора данных.
  • OnFetchComplete – завершение выборки.

2) Уведомления об изменении положения текущей записи в наборе.

  • OnWillMove, OnMoveComplete – вызываются до и после изменения положения текущей записи. OnWillMove позволяет отменить действие.
  • OnEndOfRecordset – вызывается при достижении конца набора данных, позволяет добавить новую запись.

3) Уведомления об изменении набора данных

  • OnWillChangeField, OnFieldChangeComplete – до и после изменения текущей записи набора.
  • OnWillChangeRecord, OnRecordChangeComplete – вызываются до и после изменения, добавления, удаления строки набора и отмене этих действий.
  • OnWillChangeRecordset, OnRecordsetChangeComplete - вызываются до и после открытия, закрытия, повторного запроса и синхронизации набора данных.

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

Асинхронная работа с сервером

В ADO есть возможность не имеющая аналогов ни в BDE ни в InterBase. Это асинхронное выполнение операций с сервером. Могут асинхронно выполнятся установка соединения с сервером (Connection), выполнение команды (Execute) и выборка набора данных (Fetch)

Асинхронное соединение

Для включения этого режима необходимо установить свойство ConnectOptions компонента TADOConnection в coAsyncConnect.

При установлении соединения происходит

Вызывается обработчик события OnWillConnect

Управление передается в программу

После окончания соединения, как успешного, так и ошибочного, вызывается обработчик события OnConnectComplete

Асинхронное выполнение команды

Надо заметить, что все компоненты ADO, за исключением компонента TADOConnection при активизации или выполнении исполняют команду ADO. Этикомпоненты TADOCommand, TADODataSet, TADOTable, TADOQuery, TADOStoredProc. Установите в свойстве ExecuteOptionseoAsyncExecute.

При исполнении происходит

Вызывается обработчик события OnWillExecute

Управление передается в программу

После окончания выполнения команды, как успешного, так и ошибочного, вызывается обработчик события OnExecuteComplete

Асинхронная выборка данных

Асинхронная выборка данных поддерживается в компонентах TADODataSet, TADOTable, TADOQuery, TADOStoredProc. Для ее включения установите в свойстве ExecuteOptionseoAsyncFetch.

После исполнения команды происходит передача данных. В процессе передачи многократно вызывается обработчик сообщения OnFetchProgress. В его параметрах есть как количество уже переданных записей, так и общее количество. Это очень удобно для создания индикаторов типа TProgressBar. После того, как выборка с сервера закончена, вызывается обработчик события OnFetchComplete.

 

 


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное