none
ADO.NET中一次传入多个SQL,一起执行,会使用事务机制吗??? RRS feed

  • 问题

  • 比如:

    using (SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=SandBox;Integrated Security=true"))
    {
        cn.Open();
        using (SqlCommand cm = cn.CreateCommand())
        {
            cm.CommandText = "update Person set id='001' where id='003';Select * from Person;update Place set adress='test' where id='001';Select * from Place";
            cm.CommandType = System.Data.CommandType.Text;
            using (SqlDataReader reader = cm.ExecuteReader())
            {
                do
                {
                    while (reader.Read())
                    {
                        Console.WriteLine(reader["Value"].ToString());
                    }
                } while (reader.NextResult());
            }
        }
    }

    请问我传入的语句:"update Person set id='001' where id='003';Select * from Person;update Place set adress='test' where id='001';Select * from Place";
    如果第二个UPDATE语句发生错误,那么第一个UPDATE语句会被成功执行吗?

    yulai
    2011年3月3日 3:01

答案

全部回复

  • 您好,请使用TransactionScope。http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope%28VS.80%29.aspx

    您贴的代码并未使用事务,所以第二个update错误,第一个也会成功。可以自行测试。

    使用TransactionScope后,第二个错误,第一个也不会成功。

    • 已标记为答案 hangyulai 2011年3月3日 5:54
    2011年3月3日 3:42
    版主
  • 那么用TransactionScope的话我的语句是不是就要分开写啊!

    "update Person set id='001' where id='003';Select * from Person;update Place set adress='test' where id='001';Select * from Place";
    分多次调用,使用事务?

     

    另外我可以不用TransactionScope吗?这里用BEGIN TRANCTION,END TRANCTION


    yulai
    2011年3月3日 3:51
  • 是否分开不重要,只要在一个事务里就行。

    用TransactionScope更便捷啊,看看我贴出来的连接,很简洁的代码模式。当有多个连接对象时,也不是遗忘设置tran。

    另,不要在sql里管理事务。

    2011年3月3日 3:58
    版主
  • 你好!

    还可以使用 SqlTransaction 示例参考 MSDN http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqltransaction(v=vs.80).aspx


    知识改变命运,奋斗成就人生!
    • 已标记为答案 hangyulai 2011年3月3日 5:54
    2011年3月3日 4:24
    版主