MessageQueue myQueue = new MessageQueue(".\\private$\\myQueue1");
            myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            if (myQueue.Transactional)
            {
                MessageQueueTransaction myTransaction = new MessageQueueTransaction();
                try
                {
                    //启动事务
                    myTransaction.Begin();
                    //从队列中接收消息
                    System.Messaging.Message myMessage = myQueue.Receive(myTransaction);
                    SqlConnection conn = new SqlConnection("Data Source=THTFCOMPUTER\\MSSQLSERVER1;Initial Catalog=test;Integrated Security=True;User Id=sa; Password=sa;");
                    SqlCommand cmd = new SqlCommand();
                    string sql = myMessage.Label;
                    cmd.CommandText = sql;
                    cmd.Connection = conn;
                    conn.Open();                    cmd.ExecuteNonQuery();
                    conn.Close();
                    myTransaction.Commit();
                }
                catch
                {
                    myTransaction.Abort();
                }
            }
这样写有什么问题么?执行的时候只提取消息队列中第一条消息后就不继续执行了,如果提取消息成功,执行的过程中出错,如何回滚出错的那条消息?

解决方案 »

  1.   

    问题已经解决MessageQueue queue = new MessageQueue(".\\private$\\myQueue1", true);
                MessageQueueTransaction transaction = new MessageQueueTransaction();            try
                {
                    queue.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) }); ;
                    int len = queue.GetAllMessages().Length;
                    // Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到   
                    while (len > 0)
                    {
                        if (queue.Transactional)
                            transaction.Begin();
                        System.Messaging.Message message = queue.Receive(new TimeSpan(0), transaction);                    SqlConnection conn = new SqlConnection("Data Source=THTFCOMPUTER\\MSSQLSERVER1;Initial Catalog=test;Integrated Security=True;User Id=sa; Password=sa;");
                        SqlCommand cmd = new SqlCommand();
                        string sql = message.Body.ToString();
                        cmd.CommandText = sql;
                        cmd.Connection = conn;
                        conn.Open();                    cmd.ExecuteNonQuery();
                        conn.Close();                    // 如果消息队列采用了事务,则停止事务
                        if (queue.Transactional)
                        {
                            transaction.Commit();
                            len--;
                        }
                    }
                }
                catch
                {
                    if (queue.Transactional)
                        transaction.Abort();
                }
                finally
                {
                    queue.Close();
                    queue.Dispose();
                }