向SQL服务代理队列发送消息

本文关键字:消息 队列 代理 SQL 服务 | 更新日期: 2023-09-27 18:17:04

我希望通过c#向服务代理队列发送消息。我发送的命令是这样的:

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' occurred in System.Data.dll

附加信息:'2'附近语法错误。

关键字'with'附近语法错误(....)

我只是想找出一种简单的方法来发送消息到队列,这将反复发生。

任何帮助或指导将不胜感激!

向SQL服务代理队列发送消息

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