在本课中,你将学习如何启动一个会话,该对话跨同一个数据库引擎实例中的两个数据库。 你还将了解如何完成简单的请求-回复消息周期,然后结束对话。
过程
切换到 InitiatorDB 数据库
将以下代码复制并粘贴到查询编辑器窗口中,然后运行它,将上下文切换到启动会话的 InitiatorDB 数据库。
USE InitiatorDB; GO
启动会话并发送请求消息
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以启动会话,并将请求消息发送到 TargetDB 中的 TgtDB/2DBSample/TargetService。 代码必须在一个块中运行,因为变量用于将对话句柄从
BEGIN DIALOG语句传递到SEND语句。 批处理运行BEGIN DIALOG语句以开始会话并生成请求消息。 然后,它使用语句中的SEND对话句柄在该会话上发送请求消息。 最后SELECT一条语句显示已发送的消息的文本。DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER; DECLARE @RequestMsg AS NVARCHAR (100); BEGIN TRANSACTION; BEGIN DIALOG @InitDlgHandle FROM SERVICE [//InitDB/2DBSample/InitiatorService] TO SERVICE N'//TgtDB/2DBSample/TargetService' ON CONTRACT [//BothDB/2DBSample/SimpleContract] WITH ENCRYPTION = OFF; SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION (@InitDlgHandle) MESSAGE TYPE [//BothDB/2DBSample/RequestMessage] (@RequestMsg); SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
切换到 TargetDB 数据库
复制以下代码并将其粘贴到查询编辑器窗口中。 然后,运行它以将上下文
TargetDB切换到接收请求消息的数据库,并将回复消息发送回该InitiatorDB数据库。USE TargetDB; GO
接收请求并发送答复
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以从 TargetQueue2DB 接收回复消息,并将回复消息发送回发起方。 该
RECEIVE语句检索请求消息。 然后,以下SELECT语句显示文本,以便可以验证它是否与上一步中发送的消息相同。 该IF语句测试收到的消息是否为请求消息类型,以及是否SEND使用语句将答复消息发送回发起程序。 它还测试该语句是否END CONVERSATION用于结束对话的目标端。 最后SELECT一条语句显示答复消息的文本。DECLARE @RecvReqDlgHandle AS UNIQUEIDENTIFIER; DECLARE @RecvReqMsg AS NVARCHAR (100); DECLARE @RecvReqMsgName AS sysname; BEGIN TRANSACTION; WAITFOR (RECEIVE TOP (1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue2DB), TIMEOUT 1000; SELECT @RecvReqMsg AS ReceivedRequestMsg; IF @RecvReqMsgName = N'//BothDB/2DBSample/RequestMessage' BEGIN DECLARE @ReplyMsg AS NVARCHAR (100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION (@RecvReqDlgHandle) MESSAGE TYPE [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg); END CONVERSATION @RecvReqDlgHandle; END SELECT @ReplyMsg AS SentReplyMsg; COMMIT TRANSACTION; GO
切换到 InitiatorDB 数据库
复制以下代码并将其粘贴到查询编辑器窗口中。 然后,运行它,将上下文切换回接收回复消息并结束对话的 InitiatorDB 数据库。
USE InitiatorDB; GO
接收答复并结束会话
复制以下代码并将其粘贴到查询编辑器窗口中。 然后,运行代码来接收答复消息并结束会话。 该
RECEIVE语句从 InitiatorQueue2DB 检索回复消息。 该END CONVERSATION语句结束会话的发起方。 最后SELECT一条语句显示答复消息的文本,以便可以确认它与上一步中发送的内容相同。DECLARE @RecvReplyMsg AS NVARCHAR (100); DECLARE @RecvReplyDlgHandle AS UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR (RECEIVE TOP (1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue2DB), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; -- Display received request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO