Главная » Получение уведомлений MS SQL сервера в С++ Builder
|
В клиент-серверных задачах порою требуется получить понекоемому событию на SQL сервере уведомление на клиенте, при этом неопрашивая о случившихся изменениях. Реализовать данную функциональностьвозможно с использованием расширенной хранимой процедуры (extendedstored procedure), представляющей из себя динамически подключаемуюбиблиотеку, которая через сокеты по протоколу UDP будет рассылатьбродкаст (broadcast) пакеты по сети. Создание расширенной хранимойпроцедуры производилось мною в среде С++ Builder 6 c использованием ODS(Open Data Service) API для СУБД MS SQL Server 2000. Необходимообратить внимание, что по умолчанию в поставку данной среды разработкиот Borland входит статическая библиотека Opends60.lib, реализующая весьсервис предоставляемой ODS API, но данная библиотека имеет устаревшуюверсию и поддерживает только MS SQL 7. Взять файл импорта библиотеки можно http://www.messageapi.narod.ru/opends60.lib или сформировать его самостоятельно с использованием утилиты Implib.Также следует отметить, что протокол UDP не гарантирует доставкусообщения, но и не требует установления соединения, как скажем TCP, чтоявляется решающим при выборе способа доставки.Простейшим примером использования механизма уведомления,является генерация события отсылки оповещения из триггера таблицыаудита пользователей при добавлении новой записи. Таблица, именуемаяEVENTS, имеет структуру, состоящую из уникального идентификаторазаписи, логина пользователя и информационного сообщения, о котором надоуведомить всех заинтересованных подписчиков. Расширенная процедура"xp_event" может иметь следующие входные параметры: ,, , ,. В качестве имени хоста можно задатьшироковещательный адрес. К примеру, 223.1.2.255 (net-directed broadcast– вещание в пределах сети 223.1.2.XXX), 255.255.255.255 (limitedbroadcast address), когда хост может не знать собственной маски подсетии своего IP адреса, а можно и просто сетевое имя машины локальной сети.Обратите внимание, что если ваша сеть разделена на подсети, томаршрутизатор не пропустит широковещательные пакеты без дополнительнойнастройки. Номер порта UDP произволен, но следует избегать принастройке системных портов используемых операционной системой. Поумолчанию на клиенте для прослушивания используется порт 3338.Компонент TSQLAlerter имеет два метода: Start и Stop, которые соответственно создают новыйпроцесс для прослушивания порта и останавливают его, т.е. клиентвыступает в роли UDP сервера. Событие OnGetMessage наступает в моментполучения оповещения, а указатель на визуальный компонент TLabelпозволяет визуализировать полученное сообщение на форме. Структура,используемая для пересылки данных имеет следующий вид:typedef struct TDATASEND // Структура для пересылки { char message[1024]; char login[1024]; long id; } TDATASEND; Поток получает уведомление и в методе AddMessage()синхронизирует свойства Message, RecordId и Login обьекта класса TSQLAlerter. СвойствоLanguage отвечает за язык, используемый при визуализации основныхсообщений об ошибках в работе компонента. Пример регистрации процедурыи реализации отсылки уведомления можно посмотреть в скрипте TSQLAlerter.sql |
|
Категория: Языки программирования | Просмотров: 93 |