SQL Serverから MSMQ にメッセージを投稿する

この記事では、SQL Serverから MSMQ にメッセージを投稿する方法について説明します。

元の製品バージョン: Microsoft メッセージ キュー
元の KB 番号: 555070

概要

SQL Server ストアド プロシージャ内から Microsoft Message Queuing と対話する機能により、一般的なビジネス上の問題に対して考えられる多数のソリューションを開くことができます。 このヒントでは、任意のメッセージを到達可能なメッセージ キューに投稿するために使用できる手法について説明します。

メッセージ キューと対話するために Visual Basic 6 (およびその他の) アプリケーションで使用できる COM インターフェイスがあります。 ただし、必要なメソッド (MSMQMessage クラスの Send メソッド) は、SQL Server内から使用することはできません。 この制限の理由は、メッセージキューにメッセージを投稿するために使用されるメソッドが、パラメーターとして Variant を受け入れることです。 SQL Serverでは COM オブジェクトをインスタンス化できますが、バリアント 型のデータ型の渡しは許可されません。

解決策は、Send メソッドの周囲に型固有のラッパーを配置することです。 このようにして、SQL Serverは COM オブジェクトを作成するだけでなく、文字列 (またはその他の組み込み SQL データ型) を オブジェクトに渡すことにより、メッセージキューにメッセージをポストします。 次の手順では、この目標を達成します。

Send メソッドの周囲に型固有のラッパーを作成する

  1. Visual Studio .NET を実行します。 新しいクラス ライブラリ プロジェクトを作成します。

  2. ファイル内のクラスの名前を Class1.csSqlMsmq変更します。

  3. SendMessage というパブリック メソッドを に追加します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. アセンブリはグローバル アセンブリ キャッシュに配置する必要があるため、厳密に名前を付ける必要があります。

  5. [ ビルド] メニューで、[ ソリューションのビルド] をクリックします。

コンパイル済みアセンブリをグローバル アセンブリ キャッシュに配置する

  1. Visual Studio .NET コマンド プロンプトを実行する
  2. SqlMsmq アセンブリが作成されたディレクトリに移動します。
  3. コマンドを実行します。 gacutil /i sqlmsmq.dll

アセンブリを登録する

COM インターフェイスを介してアセンブリに実装されたクラスを使用できるようにするには、クラスに関する情報をレジストリに配置する必要があります。 これにはさまざまな方法がありますが、最も簡単な方法はアセンブリ登録ツール (regasm.exe) を使用します。

引き続き Visual Studio .NET コマンド プロンプトで、 コマンドを実行します。 regasm sqlmsmq.dll

ストアド プロシージャを作成する

クラスを SqlMsmq 使用するストアド プロシージャは、sp_OACreateと sp_OAMethod ストアド プロシージャを使用してオブジェクトをインスタンス化し、メソッドをそれぞれ呼び出します SendMessage 。 次の T-SQL コードでは、このようなストアド プロシージャが作成されます。

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'

Community ソリューション コンテンツの免責事項

MICROSOFT Corporation および/またはその各サプライヤーは、ここに含まれる情報および関連するグラフィックスの適合性、信頼性、または正確性に関する表明を行いません。 このような情報および関連するグラフィックスはすべて、いかなる種類の保証も行わずに「現状有姿」で提供されます。 MICROSOFT および/またはその各サプライヤーは、商品性、特定の目的への適合性、WORKMANLIKE の取り組み、タイトル、非侵害に関するすべての黙示的な保証と条件を含め、この情報および関連グラフィックスに関するすべての保証と条件を放棄します。 お客様は、マイクロソフトおよび/またはそのサプライヤーが、直接的、間接的、懲罰的、偶発的、特別、派生的損害、またはここに含まれる情報および関連グラフィックの使用または使用不能に起因する使用、データまたは利益の損失に対する損害を含むがこれに限定されないいかなる損害についても責任を負わないものとすることに特に同意するものとします。 契約、不法行為、過失、厳格な責任に基づく場合でも、MICROSOFT またはそのサプライヤーが損害の可能性についてアドバイスを受けた場合でも。