Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Istanza gestita di SQL di Azure
In questa lezione si apprenderà come avviare una conversazione che si estende su due database nella stessa istanza del motore di database. Si apprenderà anche come completare un semplice ciclo di messaggi di richiesta-risposta e quindi terminare la conversazione.
Procedure
Passare al database InitiatorDB
Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per passare al contesto al database InitiatorDB in cui si avvia la conversazione.
USE InitiatorDB; GO
Avviare una conversazione e inviare un messaggio di richiesta
Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per avviare una conversazione e inviare un messaggio di richiesta al TgtDB/2DBSample/TargetService in TargetDB. Il codice deve essere eseguito in un blocco perché viene usata una variabile per passare un handle di dialogo da
BEGIN DIALOGall'istruzioneSEND. Il batch esegue l'istruzioneBEGIN DIALOGper avviare la conversazione e compilare un messaggio di richiesta. Usa quindi l'handle di dialogo in un'istruzioneSENDper inviare il messaggio di richiesta in tale conversazione. L'ultimaSELECTistruzione visualizza il testo del messaggio inviato.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
Passare al database TargetDB
Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguirlo quindi per passare al contesto al
TargetDBdatabase in cui viene visualizzato il messaggio di richiesta e inviare un messaggio di risposta all'oggettoInitiatorDB.USE TargetDB; GO
Ricevere la richiesta e inviare una riposta
Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per ricevere il messaggio di risposta da TargetQueue2DB e inviare un messaggio di risposta all'iniziatore. L'istruzione
RECEIVErecupera il messaggio di richiesta. L'istruzione seguenteSELECTvisualizza quindi il testo in modo che sia possibile verificare che sia lo stesso messaggio inviato nel passaggio precedente. L'istruzioneIFverifica se il messaggio ricevuto è un tipo di messaggio di richiesta e se viene usata un'istruzioneSENDper inviare un messaggio di risposta all'iniziatore. Verifica inoltre se l'istruzioneEND CONVERSATIONviene usata per terminare il lato di destinazione della conversazione. L'istruzione finaleSELECTvisualizza il testo del messaggio di risposta.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
Passare al database InitiatorDB
Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguilo quindi per tornare al contesto del database InitiatorDB, dove ricevi il messaggio di risposta e concludi la conversazione.
USE InitiatorDB; GO
Ricevere la risposta e chiudere la conversazione
Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Quindi, eseguirlo per ricevere il messaggio di risposta e terminare la conversazione. L'istruzione
RECEIVErecupera il messaggio di risposta da InitiatorQueue2DB. L'istruzioneEND CONVERSATIONtermina il lato iniziatore della conversazione. L'ultimaSELECTistruzione visualizza il testo del messaggio di risposta in modo da poter confermare che è uguale a quello inviato nel passaggio precedente.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