共用方式為


第 4 課:開始交談和傳輸訊息

適用於:SQL Server Azure SQL 受控執行個體

在本課程中,您將了解如何開始跨越相同資料庫引擎之執行個體中兩個資料庫的交談。 此外,您也將學會如何完成簡易要求回覆訊息循環,然後結束交談。

程序

切換至 InitiatorDB 資料庫

  • 將下列程式碼複製並貼入 [查詢編輯器] 視窗中。 然後執行該程式碼,以將內容切換至 InitiatorDB 資料庫,如此您就可以在其中起始交談。

        USE InitiatorDB;
        GO
    

啟動交談並傳送要求訊息

  • 將下列程式碼複製並貼入 [查詢編輯器] 視窗中。 然後執行該程式碼以開始交談,並將要求訊息傳送至 TargetDB 中的 //TgtDB/2DBSample/TargetService。 此程式碼必須在單一區塊中執行,因為系統會使用變數,將對話控制代碼從 BEGIN DIALOG 傳遞至 SEND 陳述式。 此批次會執行 BEGIN DIALOG 陳述式來開始交談並建立要求訊息。 然後,它會使用 SEND 陳述式中的對話控制代碼,傳送該交談的要求訊息。 最後一個 SELECT 陳述式會顯示已傳送之訊息的文字。

        DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
        DECLARE @RequestMsg 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 UNIQUEIDENTIFIER;
        DECLARE @RecvReqMsg NVARCHAR(100);
        DECLARE @RecvReqMsgName 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 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 NVARCHAR(100);
        DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReplyDlgHandle = conversation_handle,
            @RecvReplyMsg = message_body
          FROM InitiatorQueue2DB
        ), TIMEOUT 1000;
    
        END CONVERSATION @RecvReplyDlgHandle;
    
        -- Display recieved request.
        SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
        COMMIT TRANSACTION;
        GO
    

後續步驟

這總結教學課程。 教學課程僅是簡介, 不會描述全部的可用選項。 教學課程使用精簡邏輯及錯誤處理,無法在實際執行環境中使用。 若要建立有效率、可靠及健全的交談,您需要比此教學課程中更複雜的程式碼。

另請參閱