powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перехват события базы данных FireBird клиентон Delphi/Lazarus
21 сообщений из 21, страница 1 из 1
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109645
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрых выходных,

в MSSQL и C# помнится были компоненты и возможность посволяющие привязать событие в базе данных (например изменение данных в определённом поле, записи, таблице итп) к событию в программе. Есть ли что то подобное штатное в FireDac дельфей, и в штатных компонентах для работы с базами Firebird в Lazarus?
И если нет то кто и как выкручивается если перехват такого события на клиенте понадобился?

Delphi и FireDac от 10.4
Lazarus последний стабильный релиз.
Firebird от 2.5.8 и выше.

Спасибо.
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109646
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunв MSSQL и C# помнится были компоненты и возможность посволяющие привязать
событие в базе данных (например изменение данных в определённом поле, записи,
таблице итп) к событию в программе.

Не было. Этот функционал есть у Firebird/Interbase и Oracle, но у MS SQL его
нет. Все выкручиваются через самописные CLR функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109647
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
hlopotunв MSSQL и C# помнится были компоненты и возможность посволяющие привязать
событие в базе данных (например изменение данных в определённом поле, записи,
таблице итп) к событию в программе.

Не было. Этот функционал есть у Firebird/Interbase и Oracle, но у MS SQL его
нет. Все выкручиваются через самописные CLR функции.
Дмитрий, а в Firebird полагаю речь идет о схеме "триггеры + события" ?
Помнится, не раз видел (в том числе и от вас) рекомендации не использовать события совсем. Насколько это актуально в тройке и четверке FB ?
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109648
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109649
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoftologicПомнится, не раз видел (в том числе и от вас) рекомендации не использовать
события совсем. Насколько это актуально в тройке и четверке FB ?

Эти рекомендации связаны в первую очередь с тем, что новички их используют
слишком рьяно вплоть до обновления запросов в гриде. Во вторую очередь - с тем,
что создать универсальный VCL компонент для их получения невозможно без
проктостоматологии, поскольку на уровне API событие приходит как вызов callback
функции в фоновом потоке. Сочетание этих двух факторов способно породить такие
спецэффекты, что без поллитра не разберёшься. Отсюда рекомендации новичкам не
использовать их, от греха подальше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109659
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
SoftologicПомнится, не раз видел (в том числе и от вас) рекомендации не использовать
события совсем. Насколько это актуально в тройке и четверке FB ?

Эти рекомендации связаны в первую очередь с тем, что новички их используют
слишком рьяно вплоть до обновления запросов в гриде. Во вторую очередь - с тем,
что создать универсальный VCL компонент для их получения невозможно без
проктостоматологии, поскольку на уровне API событие приходит как вызов callback
функции в фоновом потоке. Сочетание этих двух факторов способно породить такие
спецэффекты, что без поллитра не разберёшься. Отсюда рекомендации новичкам не
использовать их, от греха подальше.
Ок, тогда следующий вопрос скорее к разработчикам. Посмотрел справку к четверке - эвенты все также без параметров. Следовательно, если нужно передать параметр, делаем конкатенацию с наименованием эвента. Но... это как то... не вполне не изящно, мягко говоря?!
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109662
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SoftologicНо... это как то... не вполне не изящно, мягко говоря?!

Зато изящной является их текущая реализация в виде простейших счётчиков. Которая
таки да, не предусматривает места для payload (в отличии от оракуловской и
слоновьей, которые построены на очереди).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109663
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softologic
Следовательно, если нужно передать параметр, делаем конкатенацию с наименованием эвента
Не угадали. Вы получите события только те, на которые подписаны. Т.е., либо вы при подписке указываете сразу все возможные комбинации параметров, либо придумываете как от них отказаться
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109666
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Softologic, есть параметр. :)
Параметр называется "количество срабатываний в данной транзакции".
Дело в том, что эвенты фаерберда к клиенты летят по коммиту. Прикинь, как было бы весело при (например) каскадном удалении 10000 записей получить 10 000 эвентов, да ещё с параметрами. :)
...
Совсем не сложно "параметры" писать в табличку-лог, дополняя записи таймстампом: получил эвент, выгреб параметры начиная с такого-то момета, и делай с ними, что хочешь...
...
Также несложно реализовать эвенты, как в одном из примеров для MSSQL: зовёшь udf - клиент http (например) сервера, а в приложении - вебсокеты, ждущие эвента. Только срабатывать будут сразу, а не по коммиту...
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109681
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
Softologic, есть параметр. :)
Параметр называется "количество срабатываний в данной транзакции".
Дело в том, что эвенты фаерберда к клиенты летят по коммиту. Прикинь, как было бы весело при (например) каскадном удалении 10000 записей получить 10 000 эвентов, да ещё с параметрами. :)
...
Совсем не сложно "параметры" писать в табличку-лог, дополняя записи таймстампом: получил эвент, выгреб параметры начиная с такого-то момета, и делай с ними, что хочешь...
...
Также несложно реализовать эвенты, как в одном из примеров для MSSQL: зовёшь udf - клиент http (например) сервера, а в приложении - вебсокеты, ждущие эвента. Только срабатывать будут сразу, а не по коммиту...

Ну я собсно вообще от них (эвентов) отказался :)
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109686
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Вы получите события только те, на которые подписаны. Т.е., либо вы при подписке указываете сразу все возможные комбинации параметров, либо придумываете как от них отказаться

Так и делал когда то давно.
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109725
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

в IBX естьIBEvents

https://www.ibase.ru/ibx
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109729
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
hlopotun,

в IBX естьIBEvents

https://www.ibase.ru/ibx
Но он очень глючит, пока напильником не подточишь.
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109766
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
в Лазаре нормально работает. На дельфях не проверял.
Да и использую я его для взведения пропертей-флагов. При активации/перерисовке окон/вкладок датасеты обновляются и сбрасывают флаг, только если флаг взведен. Красота.

А в чем глюк?
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109780
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док

А в чем глюк?
Да там не один, там много было, уже и не вспомню все.
И не всегда приходили события, и не все, и падало при определенном кол-ве зарегистрированных.
Ну и, конечно, логические глюки от того, что OnEvent реализован через synchronize.
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109820
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
пока напильником не подточишь.
Я полностью переписал. Подточенная версия работала через пень-колоду
YuRock
логические глюки от того, что OnEvent реализован через synchronize.
Мне интересно, а чем ты это заменил? Потому что переключение потоков там необходимо.

Я сам сделал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TMyIBEvents.SyncAlert;
begin
  case FSynchroMethod of
    smSynchronize: TThread.Synchronize(nil, DoSync);
    smWindow: Win32Check(PostMessage(FSynchroObject, FSynchroMessage, WPARAM(Self), 0));
    smThread: Win32Check(PostThreadMessage(FSynchroObject, FSynchroMessage, WPARAM(Self), 0));
    smEvent: Win32Check(SetEvent(FSynchroObject));
  end;
end;

а потом в контексте потока БД вызывается такое
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function TEventBlock.GetCatchedEvent(out AEvent: string; out ACount: Cardinal): Boolean;
begin
  AEvent := FCatchedEvents[0];
  ACount := Cardinal(FCatchedEvents.Objects[0]);
  FCatchedEvents.Delete(0);
  Result := FCatchedEvents.Count > 0;
  if not Result then
    QueueEvent;
end;

procedure TEventBlock.QueueEvent;
begin
  FOwner.Database.Call(
    FOwner.GDSLibrary.isc_que_events(
      StatusVector,
      @FOwner.Database.Handle,
      @FID,
      FLen,
      FEvents,
      @EventCallback,
      PVoid(Self)
    ),
    True
  );
end;
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109853
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Мне интересно, а чем ты это заменил? Потому что переключение потоков там необходимо.
Ничем, так из того потока и вызывается.
Когда надо - полылаю сообщение в главный поток (уже в обработчике), когда не надо - что-то другое делаю, прямо там.
Гриды мне там обновлять не надо, я таким не пльзуюсь. Обычно - добавляю в свою очередь задание.
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109858
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Softologic, есть параметр. :)
Параметр называется "количество срабатываний в данной транзакции".
Дело в том, что эвенты фаерберда к клиенты летят по коммиту. Прикинь, как было бы весело при (например) каскадном удалении 10000 записей получить 10 000 эвентов, да ещё с параметрами. :)
...
Совсем не сложно "параметры" писать в табличку-лог, дополняя записи таймстампом: получил эвент, выгреб параметры начиная с такого-то момета, и делай с ними, что хочешь...
...
Также несложно реализовать эвенты, как в одном из примеров для MSSQL: зовёшь udf - клиент http (например) сервера, а в приложении - вебсокеты, ждущие эвента. Только срабатывать будут сразу, а не по коммиту...

Таблички, логи, udf, http, вебсокеты, ждущие ивенты. Какой ужас и кошмар. Как хорошо, что я юзаю иветны только в слоне, где они с параметрами :)
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109864
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Ничем, так из того потока и вызывается.
Из него нельзя вызывать isc_que_events() 11698503 . Или у тебя на события отдельное соединение?
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109870
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRock
Ничем, так из того потока и вызывается.
Из него нельзя вызывать isc_que_events() 11698503 . Или у тебя на события отдельное соединение?
Проверил.
Да, QueueEvents всё еще вызывается в synchronize. Даже не знал. Я только вызов события наверх убрал оттуда, а это вроде не мешало.
...
Рейтинг: 0 / 0
Перехват события базы данных FireBird клиентон Delphi/Lazarus
    #40109874
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Из него нельзя вызывать isc_que_events()

И не только. Оттуда вообще практически ничего нельзя вызывать.
isc_event_counts() - можно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перехват события базы данных FireBird клиентон Delphi/Lazarus
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]