SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Microsoft SQL Server » MS SQL+Alerts+FireDAC (успешный опыт скрещивания)
- MS SQL+Alerts+FireDAC [сообщение #2312] Sun, 21 May 2023 22:48 Переход к следующему сообщению
GrigoryFomin в настоящее время не в онлайне  GrigoryFomin
Сообщений: 91
Зарегистрирован: April 2023
Member
У кого-то получилось настроить уведомления от MS SQL сервера в FireDAC? Примеров в сети практически нет, ИИ тоже молчит. Пробовал код из инета:
procedure TChatForm.btn1Click(Sender: TObject);
begin
	qryFireEvents.SQL.Clear;

	if qryFireEvents.Connection.ConnectionMetaDataIntf.EventSupported then begin
		qryFireEvents.Connection.ExecSQL('delete from dbo.Test');
		qryFireEvents.Connection.ExecSQL('insert into dbo.Test values (1, ''Test1'')');

		qryFireEvents.Connection.ExecSQL('delete from dbo.Test2');
		qryFireEvents.Connection.ExecSQL('insert into dbo.Test2 values (1, ''Test2'')');

	end;
end;

procedure TChatForm.ea1Alert(ASender: TFDCustomEventAlerter;
  const AEventName: string; const AArgument: Variant);
var
	i: Integer;
	sArgs: String;
begin
	if VarIsArray(AArgument) then
  begin
		sArgs := '';
		for i := VarArrayLowBound(AArgument, 1) to VarArrayHighBound(AArgument, 1) do
    begin
			if sArgs <> '' then
				sArgs := sArgs + ', ';
			sArgs := sArgs + VarToStr(AArgument[i]);
		end;
	end
	else if VarIsNull(AArgument) then sArgs := '<NULL>'
	else if VarIsEmpty(AArgument) then sArgs := '<UNASSIGNED>'
	else sArgs := VarToStr(AArgument);
	Mem1.Lines.Add('Event - [' + AEventName + '] - [' + sArgs + ']');

end;

procedure TChatForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
	if not ea1.Active then Exit;
	ea1.Unregister;
end;

procedure TChatForm.FormCreate(Sender: TObject);
begin
	if ea1.Active then 	Exit;

	ea1.Names.Clear;

	ea1.Names.Add('QUEUE=?');
	ea1.Names.Add('SERVICE=?');
	ea1.Names.Add('CHANGE1=ev1;select id, name from dbo.Test');
	ea1.Names.Add('CHANGE2=ev2;select id, name from dbo.Test2');
	ea1.Options.Synchronize := True;
	ea1.Register;
end;
На этапе регистрации Alerter выдает такое исключение
Project warehouse.exe raised exception class EFDException with message '[FireDAC][Phys][MSSQL]-326. Cannot perform the action, because the previous action is in 
progress'.
ODBC 18, MS SQL 2022 Developer
- Re: MS SQL+Alerts+FireDAC [сообщение #2316 является ответом на сообщение #2312] Mon, 22 May 2023 12:17 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
я думаю, тут нужен Арефьев
- Re: MS SQL+Alerts+FireDAC [сообщение #2319 является ответом на сообщение #2316] Mon, 22 May 2023 14:45 Переход к предыдущему сообщениюПереход к следующему сообщению
VladF в настоящее время не в онлайне  VladF
Сообщений: 16
Зарегистрирован: September 2022
Junior Member
Да здесь, считай, и нет никого. Надо в форумах по Delphi на телеге спрашивать.

[Обновления: Mon, 22 May 2023 14:45]

Известить модератора

- Re: MS SQL+Alerts+FireDAC [сообщение #2320 является ответом на сообщение #2319] Mon, 22 May 2023 15:14 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
в телеге не форумы, а каналы.
и там насрано.
тонким слоем.
- Re: MS SQL+Alerts+FireDAC [сообщение #2321 является ответом на сообщение #2320] Mon, 22 May 2023 17:04 Переход к предыдущему сообщениюПереход к следующему сообщению
VladF в настоящее время не в онлайне  VladF
Сообщений: 16
Зарегистрирован: September 2022
Junior Member
Не а бровь, а в глаз!
А альтернативой является ожидание помощи в здешних пустынях.
До седьмого пришествия, но с чистыми руками.
- Re: MS SQL+Alerts+FireDAC [сообщение #2322 является ответом на сообщение #2321] Mon, 22 May 2023 17:56 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
дельфисты вообще нынче редкость.
остались в основном старые пердуны аксакалы, типа нас.
был у нас в конторе один юный падаван с магистратурой в анамнезе, но мерзкие web-олухи его сманили пообещав чуть больше денег.
- Re: MS SQL+Alerts+FireDAC [сообщение #2324 является ответом на сообщение #2316] Mon, 22 May 2023 21:06 Переход к предыдущему сообщениюПереход к следующему сообщению
GrigoryFomin в настоящее время не в онлайне  GrigoryFomin
Сообщений: 91
Зарегистрирован: April 2023
Member
ну в принципе, на сишарпе или вижуалси разве не аналогичным образом уведомления посылаются? По сути, понять, как на это уведомление подписаться и как об этом сказать МССКЛ
- Re: MS SQL+Alerts+FireDAC [сообщение #2327 является ответом на сообщение #2324] Tue, 23 May 2023 00:29 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
Ну, это пришлось бы лазить по исходникам ФаерДака, отладчиком каким-то пользоваться, документацию читать. Тут программист нужен...
- Re: MS SQL+Alerts+FireDAC [сообщение #2329 является ответом на сообщение #2324] Tue, 23 May 2023 09:44 Переход к предыдущему сообщениюПереход к следующему сообщению
VladF в настоящее время не в онлайне  VladF
Сообщений: 16
Зарегистрирован: September 2022
Junior Member
А вот из этого - все сделал?

Microsoft SQL Server QueryNotifies (*) The Query Update Notification service is used. The TFDEventAlerter.Names content should have one of the following formats:

CHANGE<index>=<message>;<SELECT query>. The event is fired when the data returned by the SELECT query is be updated and the <message> is returned as the event name. To fire an event, an UPDATE statement against the selected data must be executed.
<message>. FireDAC creates the _FD_EVENTS table. The event is fired when the VALUE of the NAME=<message> row is updated. To fire an event, an UPDATE statement must be performed.

Additionally, these parameters can be specified in the Names:

SERVICE=<name>. The name of the service to use. '?' means creating a uniquely-named service and dropping it after usage.
QUEUE=<name>. The name of the message queue to use. '?' means creating a uniquely-named queue and dropping it after usage.

Note: To enable the query notification, execute the following command:

ALTER DATABASE <your db name> SET ENABLE_BROKER
- Re: MS SQL+Alerts+FireDAC [сообщение #2359 является ответом на сообщение #2329] Tue, 23 May 2023 22:37 Переход к предыдущему сообщениюПереход к следующему сообщению
GrigoryFomin в настоящее время не в онлайне  GrigoryFomin
Сообщений: 91
Зарегистрирован: April 2023
Member
Честно говоря - концепцию не понял. Как-то обрывочно объясняется. Есть сэмп от абракадабры, но тоже непонятно. Там перечяисляем поля в селекте - алерты только от них будут. Как-то нечетко. Вон, файрберд - просто, надежно, FIREDAC-ово. POST_EVENT и лови его в алертере. А тут намудрили. Проще имхо в триггерах на DML операторы писать в какой-то лог и клиент будет этот лог с периодичностью в 2 секунды проверять на наличие новых записей. Я хотел и корпоративный чат делать на основе MS SQL, но что-то там слишком мудрено. Да и по документации - чем больше алертеров - тем больше соединений с сервером и нужно пул соединений использовать.
- Re: MS SQL+Alerts+FireDAC [сообщение #2362 является ответом на сообщение #2359] Wed, 24 May 2023 10:27 Переход к предыдущему сообщениюПереход к следующему сообщению
VladF в настоящее время не в онлайне  VladF
Сообщений: 16
Зарегистрирован: September 2022
Junior Member
Однако, ты не ответил на вопрос.
К тому же, полагаю, здесь надо просто выполнить все указанные (выше) рекомендации буквально.
Попробуй еще альтернативный пример ссылке:
https://stackoverflow.com/questions/44648052/unable-to-get-t he-delphi-eventalerter-sample-working-with-sql-server-2012
- Re: MS SQL+Alerts+FireDAC [сообщение #2386 является ответом на сообщение #2359] Thu, 25 May 2023 17:45 Переход к предыдущему сообщениюПереход к следующему сообщению
shigor в настоящее время не в онлайне  shigor
Сообщений: 26
Зарегистрирован: March 2023
Географическое положение: НиНо
Junior Member
ну так то же самое..
там 2 варианта алертов
через _FD_EVENTS - по имени - поменялось значение у имени, получил алерт - аналог предложения писать в лог.
через запрос - тут хитрее немного, хотя все то же самое.

что смущает.. т.к. все работает через локальный снапшот который создается в момент активации, и учитывая явное указание в описании исключительно на UPDATE, есть вероятность, что ни insert (даже insert и за ним update), ни delete не "ловятся"..

а connection pooling обеспечивает OLEDB, там ничего сложного..
чат на SQLServer?!
- Re: MS SQL+Alerts+FireDAC [сообщение #2398 является ответом на сообщение #2386] Sat, 27 May 2023 00:30 Переход к предыдущему сообщениюПереход к следующему сообщению
GrigoryFomin в настоящее время не в онлайне  GrigoryFomin
Сообщений: 91
Зарегистрирован: April 2023
Member
shigor писал(а) Thu, 25 May 2023 17:45
чат на SQLServer?!
а что тут такого? не хочу зверинец из БД лепить - ставить всякие FB ,SQLite или вообще свое самописное. Хотя какой гемор настроить уведомления - проще для чата FB оставить
- Re: MS SQL+Alerts+FireDAC [сообщение #2399 является ответом на сообщение #2398] Sat, 27 May 2023 14:26 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
GrigoryFomin писал(а) Fri, 26 May 2023 23:30

а что тут такого?
Архитектура, вывернутая наизнанку. СУБД не для того существуют.

Сервер чата проще с нуля написать, чем пытаться заставить СУБД им работать. Где этот сервер будет хранить историю сообщений, пользователей и прочие данные - совершенно отдельный вопрос.
- Re: MS SQL+Alerts+FireDAC [сообщение #2402 является ответом на сообщение #2399] Sat, 27 May 2023 18:05 Переход к предыдущему сообщениюПереход к следующему сообщению
GrigoryFomin в настоящее время не в онлайне  GrigoryFomin
Сообщений: 91
Зарегистрирован: April 2023
Member
SD писал(а) Sat, 27 May 2023 14:26

Сервер чата проще с нуля написать, чем пытаться заставить СУБД им работать. Где этот сервер будет хранить историю сообщений, пользователей и прочие данные - совершенно отдельный вопрос.
Вобще не вижу проблемы - те, кто онлайн - это пользователи, подключенные к субд (думаю, код для MS SQL надыбаю для этого), 1 таблица для хранения истории сообщений, настроить алертер при выводе/входе в чат и поступлении нового сообщения. Для сообщений - одна таблица с минимум полей - откуда, кому, тип сообщения, текст, сообщения, дата.
А писать с нуля - это нового демона писать, ему цеплять опять-таки какую-то субд, пробрасывать еще один порт, клиент тоже усложнится из-за применения сокетов.
- Re: MS SQL+Alerts+FireDAC [сообщение #2403 является ответом на сообщение #2402] Sat, 27 May 2023 19:07 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 369
Зарегистрирован: June 2022
Senior Member
Это не так делается. Клиенты подключаются к серверу приложений. Он же сохраняет сообщения в бд. А отправка сообщений с сервера на клиенты делается через SignalR.
Я ни разу не видел что бы бд использовали для массовой рассылки. Есть вариант при котором клиенты опрашивают бд, но он то же не очень.

Tutorial: Real-time chat with SignalR 2

А вообще все, конечно же, зависит от нагрузки.
- Re: MS SQL+Alerts+FireDAC [сообщение #2406 является ответом на сообщение #2403] Sun, 28 May 2023 14:08 Переход к предыдущему сообщению
GrigoryFomin в настоящее время не в онлайне  GrigoryFomin
Сообщений: 91
Зарегистрирован: April 2023
Member
BlackEric писал(а) Sat, 27 May 2023 19:07
Это не так делается. Клиенты подключаются к серверу приложений. Он же сохраняет сообщения в бд. А отправка сообщений с сервера на клиенты делается через SignalR.
Я ни разу не видел что бы бд использовали для массовой рассылки. Есть вариант при котором клиенты опрашивают бд, но он то же не очень.
Спасибо за ссыль - полюбопытствуюсь. Насчет чата на основе СУБД - приложение уже установило связь с СУБД, в нем же и крутится чат на отдельной вкладке, писем там ну 30 в день, и то, когда кого-то с ДР поздравляют Smile)) Там вполне хватает опроса таблицы на новые сообщения раз в 3 секунды. А по-вашему нужен отдельный сервис, а это лишний порт, его проброска, лишняя экзеха....Не вижу смысла. Да и в рамках этого чата летают невидимые служебные сообщения типа запросить нужный товар, попросить скидку для себя индивидуальную и т.п.
Предыдущая тема: Расчетное число строк на выполнение
Следующая тема: По глупости потерял права SA - как восстановить?
Переход к форуму:
  


Текущее время: Thu Dec 26 03:02:36 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01920 секунд