2016-11-09 26 views
2

我正在通过C#发送消息到服务代理队列。我发送这样的命令:C#发送消息到SQL Service Broker队列

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确认上述消息的初始消息。