2016-11-09 15 views
2

C#を使用してサービスブローカキューにメッセージを送信しようとしています。C#SQL Service Broker Queueにメッセージを送信

string send = String.Format("BEGIN TRANSACTION; BEGIN DIALOG {0} FROM SERVICE [/AVAILH/xml/InitService] TO SERVICE N'/AVAILH/xml/CreateFile' ON CONTRACT [/AVAILH/xml/Contract] WITH ENCRYPTION = OFF; SEND ON CONVERSATION {0} MESSAGE TYPE [/AVAILH/xml/CreateFile] ({1}); COMMIT TRANSACTION; GO", runID, xmlMessage); 

ThreadPool.QueueUserWorkItem(delegate 
{ 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    { 
    using(SqlCommand command = new SqlCommand(send, conn)) 
    { 
     conn.Open(); 
     command.ExecuteNonQuery(); 
    } 
    } 
}); 

しかし、これが再び呼び出されるとエラーが発生します。 '2' の近くに不適切な構文:

型 'System.Data.SqlClient.SqlException' の未処理の例外は

のSystem.Data.dll

に追加情報を起こりました。

(....)「は」キーワードの近くに

不適切な構文私は繰り返し起こっされる、キューにメッセージを送信するための簡単な方法を把握しようとしています。

ご迷惑をおかけして申し訳ありません。

答えて

2
var sendCmd = @" 
    BEGIN TRANSACTION; 

    DECLARE @cid UNIQUEIDENTIFIER; 
    DECLARE @xml XML = @message; 

/* Begin dialog the conversation id into this variable. */ 
    BEGIN DIALOG @cid FROM SERVICE [/AVAILH/xml/InitService] 
     TO SERVICE N'/AVAILH/xml/CreateFile' 
     ON CONTRACT [/AVAILH/xml/Contract] 
     WITH ENCRYPTION = OFF; 

    SEND ON CONVERSATION @cid 
     MESSAGE TYPE [/AVAILH/xml/CreateFile] (@xml); 

/* if you don't do this you will have converations open forever unless 
    you clean them up later */ 
    END CONVERSATION @cid; 

    COMMIT TRANSACTION; 
"; 

using(var conn = new SqlConnection(connectionString)) 
using(var command = new SqlCommand(sendCmd, conn)) 
{ 
    command.Parameters.AddWithValue("@message", xmlMessage); 
    conn.Open(); 
    command.ExecuteNonQuery(); 
} 

あなたがそうSELECT @cid代わりEND CONVERSATION @cidの同じ変換に複数のメッセージを送信するためにできることを願うとvar cid = (Guid)command.ExecuteScalar();を使用している場合、私はまた、終了またはエラーメッセージを受信したとき、内部でアクティブにリーダーにEND CONVERSATIONを移動することをお勧めしたいです上記のメッセージのためにあなたの読者のEND CONVERSATIONで最初のメッセージを確認してください。

関連する問題