Invio di un messaggio a MSMQ da SQL Server

Questo articolo illustra come pubblicare un messaggio in MSMQ da SQL Server.

Versione originale del prodotto: Accodamento messaggi Microsoft
Numero KB originale: 555070

Riepilogo

La possibilità di interagire con Accodamento messaggi Microsoft dall'interno di una stored procedure SQL Server può aprire un numero elevato di possibili soluzioni per problemi aziendali comuni. Questo suggerimento descrive una tecnica che può essere usata per pubblicare un messaggio arbitrario in qualsiasi coda di messaggi raggiungibile.

È disponibile un'interfaccia COM che può essere usata dalle applicazioni Visual Basic 6 (e altre) per interagire con la coda dei messaggi. Tuttavia, il metodo necessario (il metodo Send della classe MSMQMessage) non può essere usato dall'interno di SQL Server. Il motivo di questa limitazione è che il metodo usato per pubblicare un messaggio in una coda di messaggi accetta variant come parametro. Anche se SQL Server consente di creare un'istanza degli oggetti COM, non consente il passaggio di un tipo di dati variant.

La soluzione consiste nell'inserire un wrapper specifico del tipo intorno al metodo Send. In questo modo, SQL Server non può creare solo l'oggetto COM, passando anche una stringa (o un altro tipo di dati SQL intrinseco) all'oggetto , che a sua volta invia il messaggio alla coda dei messaggi. I passaggi seguenti consentono di raggiungere questo obiettivo.

Creare il wrapper specifico del tipo per il metodo Send

  1. Eseguire Visual Studio .NET. Creare un nuovo progetto libreria di classi.

  2. Modificare il nome della classe nel file SqlMsmqin Class1.cs .

  3. Aggiungere un metodo pubblico denominato SendMessage a 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();
        }
    }
    
  4. Poiché l'assembly deve essere inserito nella Global Assembly Cache, deve essere denominato in modo sicuro.

  5. Nel menu Compila fare clic su Compila soluzione.

Inserire l'assembly compilato nella Global Assembly Cache

  1. Eseguire il prompt dei comandi di Visual Studio .NET
  2. Passare alla directory in cui è stato creato l'assembly SqlMsmq.
  3. Eseguire il comando : gacutil /i sqlmsmq.dll

Registrare l'assembly

Per rendere disponibile la classe implementata nell'assembly tramite un'interfaccia COM, le informazioni sulla classe devono essere inserite nel Registro di sistema. Anche se esistono diversi modi per eseguire questa operazione, il più semplice usa lo strumento di registrazione assembly (regasm.exe).

Sempre nel prompt dei comandi di Visual Studio .NET eseguire il comando : regasm sqlmsmq.dll.

Creare la stored procedure

La stored procedure che usa la SqlMsmq classe utilizza le sp_OACreate e sp_OAMethod le stored procedure per creare un'istanza dell'oggetto e richiamare rispettivamente il SendMessage metodo . Il codice T-SQL seguente crea una stored procedure di questo tipo.

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'

Dichiarazione di non responsabilità per il contenuto delle soluzioni della Community

MICROSOFT CORPORATION E/O I RISPETTIVI FORNITORI NON RILASCIANO ALCUNA DICHIARAZIONE SULL'IDONEITÀ, L'AFFIDABILITÀ O L'ACCURATEZZA DELLE INFORMAZIONI E DELLA GRAFICA CORRELATA CONTENUTE NEL PRESENTE DOCUMENTO. TUTTE LE INFORMAZIONI E GLI ELEMENTI GRAFICI CORRELATI SONO FORNITI "COSÌ COME SONO" SENZA GARANZIA DI ALCUN TIPO. MICROSOFT E/O I RISPETTIVI FORNITORI RIFIUTANO TUTTE LE GARANZIE E LE CONDIZIONI RELATIVE ALLE INFORMAZIONI E ALLA GRAFICA CORRELATA, INCLUSE TUTTE LE GARANZIE IMPLICITE E LE CONDIZIONI DI COMMERCIABILITÀ, IDONEITÀ PER UNO SCOPO SPECIFICO, IMPEGNO PROFESSIONALE, TITOLO E NON VIOLAZIONE. L'UTENTE ACCETTA IN MODO SPECIFICO CHE IN NESSUN CASO MICROSOFT E/O I SUOI FORNITORI SIANO RESPONSABILI PER EVENTUALI DANNI DIRETTI, INDIRETTI, PUNITIVI, INCIDENTALI, SPECIALI, CONSEQUENZIALI O DI QUALSIASI TIPO, INCLUSI, SENZA LIMITAZIONE, DANNI PER PERDITA DI UTILIZZO, DATI O PROFITTI, DERIVANTI DA O IN QUALSIASI MODO CONNESSI ALL'USO O ALL'IMPOSSIBILITÀ DI UTILIZZARE LE INFORMAZIONI E LA GRAFICA CORRELATA CONTENUTA NEL PRESENTE DOCUMENTO, CHE SI TRATTI DI CONTRATTO, ILLECITO, NEGLIGENZA, RESPONSABILITÀ RIGOROSA O ALTRO, ANCHE SE MICROSOFT O UNO DEI SUOI FORNITORI È STATO INFORMATO DELLA POSSIBILITÀ DI DANNI.