sql-server – 重构ADO.NET – SqlTransaction与TransactionScope

我已经“继承”了一个C#方法,它创建一个ADO.NET SqlCommand对象,并将要保存到数据库的项目列表(SQL Server 2005)循环。

现在,使用传统的SqlConnection / SqlCommand方法,为了确保一切正常,两个步骤(删除旧条目,然后插入新的条目)被包装到ADO.NET SqlTransaction中。

using (SqlConnection _con = new SqlConnection(_connectionString))
{
   using (SqlTransaction _tran = _con.BeginTransaction())
   {
      try
      {
         SqlCommand _deleteOld = new SqlCommand(......., _con);
         _deleteOld.Transaction = _tran;
         _deleteOld.Parameters.AddWithValue("@ID", 5);

         _con.Open();

         _deleteOld.ExecuteNonQuery();

         SqlCommand _insertCmd = new SqlCommand(......, _con);
         _insertCmd.Transaction = _tran;

         // add parameters to _insertCmd

         foreach (Item item in listOfItem)
         {
            _insertCmd.ExecuteNonQuery();
         }

         _tran.Commit();
         _con.Close();
       }
       catch (Exception ex)
       {
          // log exception
          _tran.Rollback();
          throw;
       }
    }
}

现在,我最近一直在阅读很多关于.NET TransactionScope类的内容,我想知道这里的首选方法是什么?通过切换到使用,我可以获得任何东西(可读性,速度,可靠性)

using (TransactionScope _scope = new TransactionScope())
{
  using (SqlConnection _con = new SqlConnection(_connectionString))
  {
    ....
  }

  _scope.Complete();
}

你会喜欢什么,为什么?

渣子

最佳答案
通过将现有代码切换到使用TransactionScope,您不会立即获得任何东西。您应该将其用于未来的开发,因为它提供了灵活性。这将使以后更容易将除ADO.NET调用之外的其他内容包含在事务中。

BTW,在您发布的示例中,SqlCommand实例应该使用块。

转载注明原文:sql-server – 重构ADO.NET – SqlTransaction与TransactionScope - 代码日志