Les 4: Een gesprek starten en berichten verzenden

Van toepassing op:SQL ServerAzure SQL Managed Instance

In deze les leert u hoe u een gesprek start dat twee databases omvat in hetzelfde exemplaar van de database-engine. U leert ook hoe u een eenvoudige cyclus voor het beantwoorden van aanvragen voltooit en vervolgens het gesprek beëindigt.

Procedures

Overschakelen naar de InitiatorDB-database

  • Kopieer en plak de volgende code in een queryeditorvenster en voer deze uit om de context over te schakelen naar de InitiatorDB-database waar u het gesprek start.

    USE InitiatorDB;
    GO
    

Een gesprek starten en een aanvraagbericht verzenden

  • Kopieer en plak de volgende code in een queryeditorvenster, voer deze uit om een gesprek te starten en een aanvraagbericht te verzenden naar de TgtDB/2DBSample/TargetService in targetDB. De code moet in één blok worden uitgevoerd omdat een variabele wordt gebruikt om een dialoogvenstergreep van BEGIN DIALOG de instructie door te SEND geven. De batch voert de BEGIN DIALOG instructie uit om het gesprek te starten en een aanvraagbericht te maken. Vervolgens wordt de dialoogvenstergreep in een SEND instructie gebruikt om het aanvraagbericht in dat gesprek te verzenden. In de laatste SELECT instructie wordt de tekst weergegeven van het bericht dat is verzonden.

    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
    

Overschakelen naar de TargetDB-database

  • Kopieer en plak de volgende code in een queryeditorvenster. Voer deze vervolgens uit om over te schakelen naar de TargetDB database waar u het aanvraagbericht ontvangt en een antwoordbericht terugstuurt naar de InitiatorDBdatabase.

    USE TargetDB;
    GO
    

De aanvraag ontvangen en een antwoord verzenden

  • Kopieer en plak de volgende code in een queryeditorvenster, voer deze uit om het antwoordbericht van targetQueue2DB te ontvangen en stuur een antwoordbericht terug naar de initiator. De RECEIVE instructie haalt het aanvraagbericht op. Vervolgens wordt in de volgende SELECT instructie de tekst weergegeven, zodat u kunt controleren of het hetzelfde bericht is dat in de vorige stap is verzonden. De IF instructie test of het ontvangen bericht een aanvraagberichttype is en of een SEND instructie wordt gebruikt om een antwoordbericht terug te sturen naar de initiator. Ook wordt getest of de END CONVERSATION instructie wordt gebruikt om de doelzijde van het gesprek te beëindigen. In de laatste SELECT instructie wordt de tekst van het antwoordbericht weergegeven.

    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
    

Overschakelen naar de InitiatorDB-database

  • Kopieer en plak de volgende code in een queryeditorvenster. Voer deze vervolgens uit om de context terug te zetten naar de InitiatorDB-database waar u het antwoordbericht ontvangt en het gesprek beëindigt.

    USE InitiatorDB;
    GO
    

Het antwoord ontvangen en het gesprek beëindigen

  • Kopieer en plak de volgende code in een queryeditorvenster. Voer het vervolgens uit om het antwoordbericht te ontvangen en het gesprek te beëindigen. De instructie RECEIVE haalt het antwoordbericht op uit InitiatorQueue2DB. De END CONVERSATION instructie beëindigt de initiatorzijde van het gesprek. In de laatste SELECT instructie wordt de tekst van het antwoordbericht weergegeven, zodat u kunt bevestigen dat het hetzelfde is als wat in de vorige stap is verzonden.

    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