使用包装器的sql事务的适当语法

时间:2012-04-23 15:35:24

标签: .net sql-server

我需要在数据库应用程序中添加sql语句的事务,到目前为止,我不需要这样做,因为我主要是提取数据,或者对现有数据进行非常小的更改。

我使用嵌套的using语句已经非常成功地使用了一个整洁的构造,但我想检查那些比我更了解的人,如果这个修改后的构造能够像我预期的那样嵌入事务。

        using (SqlCommand cmd = new SqlCommand())
        using (cmd.Connection = new SqlConnection()) {
            cmd.Connection.ConnectionString = "...";
            cmd.Connection.Open();
            using (SqlTransaction tran = cmd.Connection.BeginTransaction()) {
                // do the work (try catch wraps the statements)
                // commit transaction if no errors found or rollback
            }
            cmd.Connection.Close();
        }

提前谢谢你 问候 马丁

3 个答案:

答案 0 :(得分:1)

内置的课程TransactionScope更易于使用。在using块中实例化它,其中的任何内容都将成为同一事务的一部分。

using(var ts = new TransactionScope())
using (SqlCommand cmd = new SqlCommand()) 
using (cmd.Connection = new SqlConnection()) 
{ 
  cmd.Connection.ConnectionString = "...";
  cmd.Connection.Open();

  // Do the work

  ts.Complete();

  cmd.Connection.Close();
}

如果发生任何异常,则transactioncope将在处置时自动中止所有操作。 transactioncope还会影响在任何被调用函数中完成的任何操作,而不需要传递数据库连接。

答案 1 :(得分:1)

当你编写它时,它将无法工作 - 你必须通过SqlCommand类的Transaction property将命令与事务相关联。此外,您可能必须先打开连接才能启动事务

使用TransactionScope更容易,但要求数据库服务器设置为使用MSDTC

我们使用我工作的共享环境,而MSDTC不是一个选项。

答案 2 :(得分:0)

而不是SqlTransaction,请考虑使用TransactionScope

使用TransactionScope,您需要围绕using创建包装SqlConnection语句。要提交,您需要在块结束前调用Complete

using (var tx = new TransactionScope())
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection()) 
{
    cmd.Connection.ConnectionString = "...";
    cmd.Connection.Open();

    // do the work (try catch wraps the statements)
    // commit transaction if no errors found or rollback

    tx.Complete(); // commits transaction
}