powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
20 сообщений из 20, страница 1 из 1
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39603176
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Перевод с XE6 на DX10.2

Две разные виртуалки, на одной XE6 на другой DX10.2, одна и та же база на MSSQL2008R2.

На XE6 уведомления идут на DX10.2 нет(( Уже голову сломал.

Сам код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
    FEventAlerter.Connection          := Conn;
    FEventAlerter.Options.Synchronize := True;
    
    FEventAlerter.Names.Add('SERVICE=MyService');
    FEventAlerter.Names.Add('QUEUE=MyQueue');

    FEventAlerter.OnAlert             := ReceiveMessageEvent;

    FEventAlerter.Register;



Самое интересное из очереди сообщения таки уходят т.к. компонента их забирает, но "OnAlert" событие не срабатывает.

Люди помогите...
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39603887
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался... дело оказалось в том что нужно правильно поддерживать "Query Notification Messages" в MSSQL. Начиная с XE7 ситуация поменялась. В XE6 если формат удовлетворяет "Query Notification Messages", то тело сообщения, которое закрыто в <qn:Message>, вычленяется и передаётся слушателю, если формат не соответствует, то передавалось целиком, а вот начиная с XE7 и выше, если формат не верный то сообщение игнорируется компонентой.
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39604384
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSсообщение игнорируется компонентой.Без всяких ошибок?
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39604408
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

а куда оно его отправит, это ошибко, если Event Alerter в отдельном невизуальном потоке живет?

на сухожую тему недавно был срач между Владом Хорсуном (Firebird) и автором AnyDAC
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39604428
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа куда оно его отправит, это ошибкоНапример, куда-нибудь в OnError. Сообщения же он умудряется доставлять целевому потоку?

Даже банальная конструкция
Код: pascal
1.
2.
3.
4.
try
  raise Exception.Create('Invalid format message');
except
end;

уже предупредит разработчика в IDE, что что-то пошло не так
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39604542
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS, покажи что и как делал, что:

1) "... если формат не верный то сообщение игнорируется компонентой"
2) "дело оказалось в том что нужно правильно поддерживать "Query Notification Messages" в MSSQL."
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605050
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievИгорь_UUS, покажи что и как делал, что:

1) "... если формат не верный то сообщение игнорируется компонентой"
2) "дело оказалось в том что нужно правильно поддерживать "Query Notification Messages" в MSSQL."


Добрый день Дмитрий.

Если в очередь закинуть сообщение, например "bla-bla-bla and bla-bla-bla", то начиная с XE7 просто будет проигнорировано компонентой, безо всяких уведомлений (наверное это больше всех ставило в ступор!). Если сообщение будет отправлено согласно " https://technet.microsoft.com/en-us/library/ms189308(v=sql.105).aspx", то всё ок.

Как нашёл?! Пришлось "ковырять" исходники, в юните FireDAC.Phys.MSSQL, функция "function TFDPhysMSSQLEventAlerter.ProcessNotifications: Boolean;"

проблема в этом куске:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
for i := 0 to FMessageTab.Rows.Count - 1 do begin
    sMsg := FMessageTab.Rows[i].AsString['message_body'];
    sType := GetAttr('type');
    sSrc := GetAttr('source');
    Result := CompareText(sType, 'subscribe') <> 0;
    if (CompareText(sType, 'change') = 0) and (CompareText(sSrc, 'timeout') <> 0) or
       not Result then begin
      sInfo := GetAttr('info');
      sVal := GetValue('qn:Message');
      FMsgThread.EnqueueMsg(TFDPhysMSSQLEventMessage.Create(sVal, sType, sSrc, sInfo));
    end;
  end;



А именно, где происходит потеря сообщения, которое не удовлетворяет нотифакции майкрасофт:
Код: pascal
1.
2.
if (CompareText(sType, 'change') = 0) and (CompareText(sSrc, 'timeout') <> 0) or
       not Result then begin
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605051
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev,

Я думаю нужно соблюдать формат, но и основной поток нужно как то проинформировать, что формат не верный...
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605052
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это понятно ... Меня интересовали два примера кода отсылки сообщений:
1) Когда сообщение не доходит
2) Когда сообщение доходит
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605058
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev,

В FireDAC есть ещё огромный "пробел"))) (по крайне мере он присутствует в XE6) Связан он с использованием TVP переменных в хранимых процедурах. Если начинаешь использовать более одной такой переменной в хранику приходит заполненная только одна. Вы тогда написали что проблема в MSSQL (или в его драйвере)

напомню топик:
http://www.sql.ru/forum/1127442/firedac-storedproc-ispolzovanie-peremennyh-tablichnogo-tipa-vozmozhno-bag-firedac?hl=igor888

Скажите, изменилось ли что-нибудь в этом плане? я сейчас использую DX10.2.


и есть врой момент, TVP переменный вообще не работают с драйвером "неатив-клиент 11-й", только с 10-ым. Сейчас имеется поддержка 11-го драйвера?
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605060
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievЭто понятно ... Меня интересовали два примера кода отсылки сообщений:
1) Когда сообщение не доходит
2) Когда сообщение доходит

Не совсем понял вопроса, Вам скрипт нужен на TSQL?
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605115
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSНе совсем понял вопроса, Вам скрипт нужен на TSQL?
На чем угодно.
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605245
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievИгорь_UUSНе совсем понял вопроса, Вам скрипт нужен на TSQL?
На чем угодно.

Дмитрий здравствуйте.

Вот так будет работать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- https://technet.microsoft.com/en-us/library/ms189308(v=sql.105).aspx
-- Query Notification Messages:
DECLARE @Message NVARCHAR(512) = (
  '<qn:QueryNotification '+
    'xmlns:qn="http://schemas.microsoft.com/SQL/Notifications/QueryNotification" '+
    'type="change" source="data" info="truncate"> '+
      '<qn:Message>' + 'Test messege' + '</qn:Message> '+
  '</qn:QueryNotification>'
)

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler 
    MESSAGE TYPE [DEFAULT] (@Message)



Вот так сообщение проигнорируется:
Код: sql
1.
2.
3.
4.
5.
6.
7.
-- https://technet.microsoft.com/en-us/library/ms189308(v=sql.105).aspx
-- Query Notification Messages:
DECLARE @Message NVARCHAR(512) = 'Test messege'

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler 
    MESSAGE TYPE [DEFAULT] (@Message)
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605249
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev,

Дмитрий скажите как обстоят дела с TVP на DX10.2? (вопросы задал выше)
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605356
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

Я MSSQL в глаза не видел, но в документации сказано These contracts must allow the message type to be sent from this side of the conversation. For example, the target services of the conversations may only send messages specified in the contract as SENT BY TARGET or SENT BY ANY. If this clause is omitted, the message is of the message type DEFAULT.Может нужно не указывать тип для текстовых сообщений?
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605454
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Игорь_UUS,

Я MSSQL в глаза не видел, но в документации сказано These contracts must allow the message type to be sent from this side of the conversation. For example, the target services of the conversations may only send messages specified in the contract as SENT BY TARGET or SENT BY ANY. If this clause is omitted, the message is of the message type DEFAULT.Может нужно не указывать тип для текстовых сообщений?

Вы это про что? При чём тут "тип для текстовых сообщений", и где его нужно не указывать)))
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605550
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я про это
Код: sql
1.
2.
3.
4.
DECLARE @Message NVARCHAR(512) = 'Test messege'

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler (@Message)
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605584
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Я про это
Код: sql
1.
2.
3.
4.
DECLARE @Message NVARCHAR(512) = 'Test messege'

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler (@Message)




Бррр, я же написал, по какой причине нотифакция не работает... причём тут "тип для текстовых сообщений"? На уровне MSSQL всё ок, компонента забирает сообщения
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605595
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSя же написал, по какой причине нотифакция не работает.Не потому ли, что Вы декларируете отсылку в одном формате (MESSAGE TYPE [DEFAULT]), а посылали в другом?
...
Рейтинг: 0 / 0
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
    #39605998
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Игорь_UUSя же написал, по какой причине нотифакция не работает.Не потому ли, что Вы декларируете отсылку в одном формате (MESSAGE TYPE [DEFAULT]), а посылали в другом?

Вы писали ранее "Я MSSQL в глаза не видел", я думаю дальнейшее обсуждение про то как работает ServiceBrocker и что есть "SEND ON CONVERSATION" является бесперспективным! Вы говорите о том, о чём не имеете понятия как оно работает и устроено!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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