我很好奇以下代码是否安全?
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”构造内。 我想听听在类似情况下采取更好方法的建议。
此致
答案 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