Книга: Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil

Обработка событий InterBase при помощи FIBPIus

Обработка событий InterBase при помощи FIBPIus

InterBase дает разработчику некоторый механизм для синхронизации приложений в многопользовательской среде Event Alerts. Суть данного механизма состоит в том. что вы можете вызывать пользовательские события из триггеров или хранимых процедур при помощи функции POST_EVENT:

CREATE PROCEDURE SHOW_EVENT(

EVENT_ID INTEGER)

AS

BEGIN

IF (:EVENT_ID = 1) THEN POST_EVENT 'TEST_EVENT1';

IF (.EVENT_ID = 2) THEN POST_EVENT 'TEST_EVENT2';

IF (.EVENT_ID = 3) THEN POST_EVENT 'TEST_EVENT3';

EXIT;

END

Создадим приложение (рис 2.71), которое будет вызывать данную процедуру и получать соответствующие события Если вы впоследствии попробуете запустить это приложение на двух компьютерах, то оба приложения будут получать сообщения вне зависимости оттого, кто их инициировал


Рис 2.71. Использование InterBase events, при помощи компонента TSIBfibEventAlerter

Для вызова хранимой процедуры мы будем использовать специальный компонент pFIBStoiedPioc TpFIBStoredPioc, задав свойство StoiedProcName (рис 2.72)


Рис 2.72. Вызов хранимой процедуры при помощи компонента TpFIBStoredPioc

Компонент TpFIBStoredProc является прямым потомком TpFIBQuery и сам формирует свойство SQL в виде ' EXECUTE PROCEDURE ...' Название процедуры задается свойством StoiedProcName

Компонент SffifibEventAlerterl: TSffifibEventAlerterlпредназначен для получения приложением событий InterBase Компонент ссылается на конкретное подключение к базе данных, т.е. на компонент типа TpFIBDatabase (рис 2.73)


Рис 2.73. Свойства SIBfibEventAlerterl

Установим свойство AutoRegister в False, чтобы собственноручно зарегистрировать нужные нам события, а в свойстве Events перечислим те события, которые нас интересуют (рис. 2.74).


Рис 2.74. Список зарегистрированных событий

Чтобы компонент SIBfibEventAlerterl "получал" события, мы должны зарегистрировать их после подключения к базе данных. Для этого напишем обработчик события OnConnect у компонента pFIBDatabasel:

procedure TForml.pFIBDatabaselConnect(Sender: TObject);

begin

if not SIBfibEventAlerterl.Registered then

SIBfibEventAlerterl.RegisterEvents;

end;

Соответственно перед закрытием подключения желательно "отключить" SIBfibEventAlerterl. Для этого создадим обработчик события BeforeDisconnect компонента pFIBDatabasel:

procedure TForml.pFIBDatabaselBeforeDisconnect(Sender:

TObject);

begin

if SIBfibEventAlerterl.Registered then

SIBfibEventAlerterl.UnRegisterEvents;

end;

Зададим свойство Tag у кнопок равным соответственно 1, 2 и 3, и напишем общий обработчик события OnClick для них:

procedure TForml.ButtonsClick(Sender: TObject);

begin

if not pFIBTransactionl.InTransaction then

pFIBTransactionl.StartTransaction;

pFIBStoredProcl.Params[0].Aslnteger := TButton(Sender).Tag;

try

pFIBStoredProcl.ExecProc;

pFIBTransactionl.Commit;

except

pFIBTransactionl.Rollback;

end;

end;

Смысл кода очевиден - мы задаем значение параметра процедуры, используя свойство Tag у кнопки, на которую нажал пользователь, выполняем процедуру при помощи метода ExecProc и либо подтверждаем транзакцию, либо отменяем ее в случае ошибки. Нам остается только написать обработчик события OnEventAlert компонента SIBfibEventAlerterl:

procedure TForml . SIBf ibEvent Alerter 1 Event Alert (Sender : TObject ;

EventName: String, EventCount: Integer);

begin

ShowMessage(EventName + ' : ' + IntToStr(EventCount));

end;

Параметр EventName возвращает название произошедшего события, a EventCount возвращает количество событий EventName. Значение параметра EventCount требует некоторых разъяснений. Итак, при работе с событиями важно помнить, что реально они вызываются только в случае подтверждения транзакции. Иными словами, если вы вызываете некоторое событие 'NEW_CUSTOMER' при вставке записей в таблицу, и вызываете Commit только после вставки 1000 записей, то обработчик OnEventAlert будет вызван только один раз, сразу после Commit, и значение параметра EventCount будет равно 1000. Очевидно, что событие произошло 1000 раз, но приложение получает нотификацию обо всех событиях только после подтверждения транзакции, в контексте которой они происходили.

Мы можем запустить наше приложение. При нажатии на любую из кнопок мы будем получать сообщение о произошедшем событии, причем, как уже было сказано, если наше приложение запущено несколько раз и даже на разных компьютерах, все копии приложения будут получать нотификацию о событиях.

Оглавление книги


Генерация: 2.217. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз