我希望通过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'附近语法错误(....)
我只是想找出一种简单的方法来发送消息到队列,这将反复发生。
任何帮助或指导将不胜感激!
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
确认上述消息的初始消息。