本文介绍如何从 SQL Server 将消息发布到 MSMQ。
原始产品版本: Microsoft消息队列
原始 KB 数: 555070
总结
从 SQL Server 存储过程内与Microsoft消息队列交互的功能可以为常见业务问题打开大量可能的解决方案。 此提示描述了一种技术,可用于将任意消息发布到任何可访问的消息队列。
Visual Basic 6(和其他)应用程序可以使用 COM 接口与消息队列进行交互。 但是,无法在 SQL Server 中使用所需的方法(MSMQMessage 类的 Send 方法)。 此限制的原因是用于将消息发布到消息队列的方法接受 Variant 作为参数。 虽然 SQL Server 允许实例化 COM 对象,但它不允许传递变体数据类型。
解决方案是围绕 Send 方法放置特定于类型的包装器。 通过这种方式,SQL Server 不能仅通过向对象传递字符串(或其他内部 SQL 数据类型)来创建 COM 对象,而该对象又会将消息发布到消息队列。 以下步骤可实现此目标。
围绕 Send 方法创建特定于类型的包装器
运行 Visual Studio .NET。 创建新的“类库”项目。
将文件中类
Class1.cs
的名称更改为SqlMsmq
。将名为 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(); } }
由于程序集必须放置在全局程序集缓存中,因此必须强命名它。
在 “生成” 菜单上,单击 “生成解决方案” 。
将编译的程序集放入全局程序集缓存中
- 运行 Visual Studio .NET 命令提示符
- 导航到在其中创建了 SqlMsmq 程序集的目录。
- 执行命令:
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'
社区解决方案内容声明
MICROSOFT公司及其各自的供应商对此处包含的信息和相关图形的适用性、可靠性或准确性没有陈述。 所有这些信息和相关的图形都“按原样”提供,没有任何保证。 MICROSOFT及其各自的供应商特此声明不承担与此信息和相关图形有关的所有保证和条件,包括适销性的所有默示保证和条件、针对特定用途的适用性、合乎职业标准的努力、所有权和非侵权。 您明确同意,在任何情况下,MICROSOFT和/或其供应商不对任何直接、间接、惩罚性、附带性、特殊性、后果性损害或任何其他损害承担责任,包括但不限于因使用或无法使用此处包含的信息和相关图形而引起的或与之相关的损害。无论是基于合同、侵权、疏忽、严格责任还是其他原因,即使MICROSOFT或其任何供应商已被告知可能产生损害赔偿。