【问题标题】:C# Send message to SQL Service Broker QueueC# 向 SQL 服务代理队列发送消息
【发布时间】:2016-11-09 18:10:17
【问题描述】:

我希望通过 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.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

附加信息:“2”附近的语法不正确。

关键字 'with'(....) 附近的语法不正确

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

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

【问题讨论】:

    标签: c# sql service-broker


    【解决方案1】:
    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 确认初始消息以获取上述消息。

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2018-10-24
      相关资源
      最近更新 更多