使用带有sqlTransaction的构造依赖于不同动作结果的数量

时间:2010-04-08 21:14:36

标签: c# .net sql transactions

我很好奇以下代码是否安全?

using (SqlConnection cn = new SqlClient.SqlConnection(connectionString))
{
   cn.Open();
   using (SqlTransaction tr = cn.BeginTransaction())
   {
      try
      {

         if (!Data.DoSomething1(tr, p1, p2))
         {
            tr.Rollback();
            return false;
         }

         foreach (ItemType item in Items)
         {
            if (!Data.DoSomething2(tr, p3, p4))
            {
               tr.Rollback();
               return false;
            }
         }

         tr.Commit();
         return true;
      }
      catch (Exception myErr)
      {
         if (tr != null)
            tr.Rollback();

         throw myErr;
      }
      finally
      {
         if (cn != null)
         {
            cn.Close();
            cn.Dispose();
         }
      }
   }
}

我想通过ref传递事务'tr'但不能,因为它在“using”构造内。 我想听听在类似情况下采取更好方法的建议。

此致

2 个答案:

答案 0 :(得分:1)

您无需通过引用传递事务。它是一种引用类型,因此当您将其传递给函数时,您已经提供了引用。你做得很好。

虽然您的代码还有其他一些内容,但与您的问题没有直接关系:

  • 你真的应该使用throw;而不是throw myErr;
  • 如果您已经在using语句中使用了资源,则无需明确处理您的资源。这就是using的用途。

答案 1 :(得分:1)

您的内部使用声明不需要您的finally块。

using语句的要点是你不需要使用try catch块,一个是为你创建的 - 这意味着finally块在你的例子中是多余的。你的内部使用块也是多余的。

好问题。

这里给出了使用这两个项目的模式:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx