Публикация сообщения в MSMQ из SQL Server

В этой статье показано, как отправлять сообщения в MSMQ из SQL Server.

Исходная версия продукта: Очередь сообщений Майкрософт
Оригинальный номер базы знаний: 555070

Сводка

Возможность взаимодействия с очередью сообщений Майкрософт из SQL Server хранимой процедуры может открыть большое количество возможных решений для распространенных бизнес-проблем. В этом совете описывается метод, который можно использовать для отправки произвольного сообщения в любую доступную очередь сообщений.

Существует COM-интерфейс, который может использоваться приложениями Visual Basic 6 (и другими) для взаимодействия с очередью сообщений. Однако необходимый метод (метод Send класса MSMQMessage) нельзя использовать из SQL Server. Причина этого ограничения заключается в том, что метод, используемый для отправки сообщения в очередь сообщений, принимает Variant в качестве параметра. Хотя SQL Server позволяет создавать экземпляры COM-объектов, это не позволяет передавать тип данных variant.

Решение заключается в том, чтобы поместить оболочку для конкретного типа вокруг метода Send. Таким образом, SQL Server не может только создать com-объект, а также передать строку (или другой внутренний тип данных SQL) объекту, который, в очередь, отправляет сообщение в очередь сообщений. Для достижения этой цели выполняются следующие действия.

Создание оболочки для конкретного типа вокруг метода Send

  1. Запустите Visual Studio .NET. Создайте проект библиотеки классов.

  2. Измените имя класса в файле на Class1.csSqlMsmq.

  3. Добавьте открытый метод SendMessage в Class1.cs.

    publicvoid SendMessage(string queuePath, string messageLabel, string messageBody)
    {
        if (MessageQueue.Exists(queuePath))
        {
            MessageQueue mq = new MessageQueue(queuePath);
            Message mm = new Message();
            mm.Label = messageLabel;
            mm.Body = messageBody;
            mq.Send(mm);
            mq.Close();
        }
    }
    
  4. Так как сборка должна быть помещена в глобальный кэш сборок, она должна иметь строгое имя.

  5. On the Build menu, click Build Solution.

Поместите скомпилированную сборку в глобальный кэш сборок

  1. Запуск командной строки Visual Studio .NET
  2. Перейдите в каталог, в котором была создана сборка SqlMsmq.
  3. Выполните команду: gacutil /i sqlmsmq.dll

Регистрация сборки

Чтобы класс, реализованный в сборке, был доступен через COM-интерфейс, сведения о классе должны быть помещены в реестр. Хотя существует несколько способов сделать это, самый простой использует средство регистрации сборок (regasm.exe).

В командной строке Visual Studio .NET выполните команду : regasm sqlmsmq.dll.

Создание хранимой процедуры

Хранимая процедура, использующая SqlMsmq класс , использует sp_OACreate и sp_OAMethod хранимые процедуры для создания экземпляра объекта и вызова SendMessage метода соответственно. Приведенный ниже код T-SQL создает такую хранимую процедуру.

CREATE PROCEDURE prcSendMSMQMessage
 @msmqPath varchar(255),
 @messageLabel varchar(255),
 @messageBody varchar(1000)

AS

DECLARE @msmqQueue INT
DECLARE @result INT

-- Create the SQLMSMQ Object.
EXECUTE @result = sp_OACreate 'SqlMsmq', @msmqQueue OUT, 1
IF @result <> 0 GOTO ErrorHandler

-- Send the message using the Send method
EXECUTE @result = sp_OAMethod @msmqQueue, 'SendMessage', NULL, @msmqPath, @messageLabel, @messageBody
IF @result <> 0 GOTO ErrorHandler

GOTO DestroyObjects

ErrorHandler:

DECLARE @source varchar(53)
DECLARE @description VARCHAR(200)
EXECUTE sp_OAGetErrorInfo @msmqQueue, @source OUT, @description OUT, NULL, NULL
RAISERROR(@description, 16, 1)

GOTO DestroyObjects

DestroyObjects:
-- Destroy the SQLMSMQ object.
EXECUTE @result = sp_OADestroy @msmqQueue

RETURN

The following T-SQL code provides an example of how to invoke this stored procedure:

EXEC prcSendMSMQMessage 'queue_path', 'message_label', 'message_body'

Отказ от ответственности за содержимое общедоступных решений

КОРПОРАЦИЯ МАЙКРОСОФТ И (ИЛИ) ЕЕ СООТВЕТСТВУЮЩИЕ ПОСТАВЩИКИ НЕ ДЕЛАЮТ НИКАКИХ ЗАЯВЛЕНИЙ О ПРИГОДНОСТИ, НАДЕЖНОСТИ ИЛИ ТОЧНОСТИ ИНФОРМАЦИИ И СВЯЗАННЫХ ГРАФИКОВ, СОДЕРЖАЩИХСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ. ВСЯ ТАКАЯ ИНФОРМАЦИЯ И СВЯЗАННЫЕ ГРАФИКИ ПРЕДОСТАВЛЯЮТСЯ "КАК ЕСТЬ" БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. КОРПОРАЦИЯ МАЙКРОСОФТ И (ИЛИ) ЕЕ СООТВЕТСТВУЮЩИЕ ПОСТАВЩИКИ НАСТОЯЩИМ ОТКАЗЫВАЕТСЯ ОТ ВСЕХ ГАРАНТИЙ И УСЛОВИЙ В ОТНОШЕНИИ ЭТОЙ ИНФОРМАЦИИ И СВЯЗАННОЙ ГРАФИКИ, ВКЛЮЧАЯ ВСЕ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ И УСЛОВИЯ ТОВАРНОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ТРУДОЛЮБИВЫЕ УСИЛИЯ, НАЗВАНИЕ И НЕНАРУШЕНИЯ ПРАВ. В ЧАСТНОСТИ, ВЫ СОГЛАШАЕТЕСЬ С ТЕМ, ЧТО НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ КОРПОРАЦИЯ МАЙКРОСОФТ И (ИЛИ) ЕЕ ПОСТАВЩИКИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ, КОСВЕННЫЕ, ШТРАФНЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, КОСВЕННЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ИЛИ ЛЮБЫЕ УБЫТКИ, ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, УБЫТКИ ЗА ПОТЕРЮ ИСПОЛЬЗОВАНИЯ, ДАННЫЕ ИЛИ ПРИБЫЛЬ, ВОЗНИКАЮЩИЕ ИЗ ИЛИ КАКИМ-ЛИБО ОБРАЗОМ СВЯЗАННЫЕ С ИСПОЛЬЗОВАНИЕМ ИЛИ НЕВОЗМОЖНОСТЬЮ ИСПОЛЬЗОВАТЬ ИНФОРМАЦИЮ И СООТВЕТСТВУЮЩУЮ ГРАФИКУ, СОДЕРЖАЩИЕСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, НА ОСНОВЕ КОНТРАКТА, ДЕЛИКТА, НЕБРЕЖНОСТИ, СТРОГОЙ ОТВЕТСТВЕННОСТИ ИЛИ ИНЫМ ОБРАЗОМ, ДАЖЕ ЕСЛИ КОРПОРАЦИЯ МАЙКРОСОФТ ИЛИ ЛЮБОЙ ИЗ ЕЕ ПОСТАВЩИКОВ БЫЛИ УВЕДОМЛЕНЫ О ВОЗМОЖНОСТИ УЩЕРБА.