2016-11-09 2 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(); 
    } 
    } 
}); 

Однако, когда это снова вызвано, я получаю сообщение об ошибке.

Необработанное исключение типа 'System.Data.SqlClient.SqlException' произошло в System.Data.dll

Дополнительная информация: Неправильный синтаксис около '2'.

Неправильный синтаксис около ключевого слова «с» (....)

Я просто пытаюсь выяснить, простой способ отправки сообщений в очереди, которая будет происходить неоднократно.

Любая помощь или руководство будут очень благодарны!

ответ

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(); 
} 

Если вы хотите отправить несколько сообщений о том же преобразовании вместо END CONVERSATION @cid вы можете так SELECT @cid и использовать var cid = (Guid)command.ExecuteScalar(); Я также предлагает переместить END CONVERSATION к внутренне активированное читателю при получении сообщения об окончании или ошибки и подтвердить исходное сообщение END CONVERSATION в вашем читателе для вышеуказанного сообщения.

Смежные вопросы