Senden einer Nachricht an MSMQ von SQL Server

In diesem Artikel wird gezeigt, wie Sie eine Nachricht von SQL Server an MSMQ senden.

Ursprüngliche Produktversion: Microsoft Message Queuing
Ursprüngliche KB-Nummer: 555070

Zusammenfassung

Die Möglichkeit, aus einer SQL Server gespeicherten Prozedur mit Microsoft Message Queuing zu interagieren, kann eine große Anzahl von möglichen Lösungen für häufige Geschäftsprobleme eröffnen. Dieser Tipp beschreibt eine Technik, die verwendet werden kann, um eine beliebige Nachricht in jeder erreichbaren Nachrichtenwarteschlange zu posten.

Es gibt eine COM-Schnittstelle, die von Visual Basic 6 (und anderen) Anwendungen für die Interaktion mit der Nachrichtenwarteschlange verwendet werden kann. Die erforderliche Methode (die Send-Methode der MSMQMessage-Klasse) kann jedoch nicht innerhalb von SQL Server verwendet werden. Der Grund für diese Einschränkung ist, dass die Methode, mit der eine Nachricht in einer Nachrichtenwarteschlange bereitgestellt wird, einen Variant-Wert als Parameter akzeptiert. Während SQL Server die Instanziierung von COM-Objekten zulässt, ist es nicht möglich, einen Variant-Datentyp zu übergeben.

Die Lösung besteht darin, einen typspezifischen Wrapper um die Send-Methode zu platzieren. Auf diese Weise können SQL Server nicht nur das COM-Objekt erstellen, indem sie auch eine Zeichenfolge (oder einen anderen systeminternen SQL-Datentyp) an das -Objekt übergeben, das wiederum die Nachricht an die Nachrichtenwarteschlange sendet. Mit den folgenden Schritten wird dieses Ziel erreicht.

Erstellen des typspezifischen Wrappers um die Send-Methode

  1. Führen Sie Visual Studio .NET aus. Erstellen Sie ein neues Klassenbibliotheksprojekt.

  2. Ändern Sie den Namen der Klasse in der Class1.cs Datei in SqlMsmq.

  3. Fügen Sie eine öffentliche Methode namens SendMessage zu hinzu 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. Da die Assembly im globalen Assemblycache platziert werden muss, muss sie einen starken Namen haben.

  5. On the Build menu, click Build Solution.

Einfügen der kompilierten Assembly in den globalen Assemblycache

  1. Ausführen der Visual Studio .NET-Eingabeaufforderung
  2. Navigieren Sie zu dem Verzeichnis, in dem die SqlMsmq-Assembly erstellt wurde.
  3. Führen Sie den Befehl aus: gacutil /i sqlmsmq.dll

Registrieren der Assembly

Um die in der Assembly implementierte Klasse über eine COM-Schnittstelle verfügbar zu machen, müssen Informationen zur Klasse in der Registrierung platziert werden. Es gibt zwar eine Reihe von Möglichkeiten, dies zu tun, am einfachsten wird jedoch das Assemblyregistrierungstool (regasm.exe) verwendet.

Führen Sie an der Visual Studio .NET-Eingabeaufforderung den folgenden Befehl aus: regasm sqlmsmq.dll.

Erstellen der gespeicherten Prozedur

Die gespeicherte Prozedur, die die SqlMsmq -Klasse verwendet, verwendet die sp_OACreate und sp_OAMethod gespeicherten Prozeduren, um das Objekt zu instanziieren und die SendMessage -Methode aufzurufen. Der folgende T-SQL-Code erstellt eine solche gespeicherte Prozedur.

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'

Haftungsausschluss für Inhalte von Community-Lösungen

DIE MICROSOFT CORPORATION UND/ODER IHRE JEWEILIGEN LIEFERANTEN GEBEN KEINE ZUSICHERUNGEN ÜBER DIE EIGNUNG, ZUVERLÄSSIGKEIT ODER GENAUIGKEIT DER HIERIN ENTHALTENEN INFORMATIONEN UND ZUGEHÖRIGEN GRAFIKEN AB. ALLE DERARTIGEN INFORMATIONEN UND ZUGEHÖRIGEN GRAFIKEN WERDEN "WIE BETEN" OHNE JEGLICHE GEWÄHRLEISTUNG BEREITGESTELLT. MICROSOFT UND/ODER SEINE JEWEILIGEN LIEFERANTEN LEHNEN HIERMIT ALLE GEWÄHRLEISTUNGEN UND BEDINGUNGEN IN BEZUG AUF DIESE INFORMATIONEN UND ZUGEHÖRIGEN GRAFIKEN AB, EINSCHLIEßLICH ALLER KONKLUDENTEN GEWÄHRLEISTUNGEN UND BEDINGUNGEN DER HANDELSÜBLICHKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK, ARBEITSMÄNCHEN ANSTRENGUNG, EIGENTUM UND NICHTVERLETZUNG VON RECHTEN. SIE STIMMEN AUSDRÜCKLICH ZU, DASS MICROSOFT UND/ODER SEINE LIEFERANTEN IN KEINEM FALL FÜR DIREKTE, INDIREKTE, STRAF-, ZUFÄLLIGE, BESONDERE, FOLGESCHÄDEN ODER SCHÄDEN JEGLICHER ART HAFTBAR SIND, EINSCHLIEßLICH, ABER NICHT BESCHRÄNKT AUF SCHÄDEN FÜR DEN VERLUST VON NUTZUNG, DATEN ODER GEWINNEN, DIE SICH AUS ODER IN IRGENDEINER WEISE IM ZUSAMMENHANG MIT DER NUTZUNG ODER DER UNFÄHIGKEIT ERGEBEN, DIE HIER ENTHALTENEN INFORMATIONEN UND ZUGEHÖRIGEN GRAFIKEN ZU VERWENDEN, OB AUFGRUND VON VERTRAG, UNERLAUBTER HANDLUNG, FAHRLÄSSIGKEIT, STRENGER HAFTUNG ODER ANDERWEITIG, AUCH WENN MICROSOFT ODER EINER SEINER LIEFERANTEN AUF DIE MÖGLICHKEIT VON SCHÄDEN HINGEWIESEN WURDE.