我“继承”了一个创建 ADO.NET SqlCommand 对象并循环保存到数据库(SQL Server 2005)项目列表的 C# 方法。
现在,使用传统的 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类的文章,我想知道,在这种情况下,哪种方法更好?如果我改用XXX,我会获得什么优势(可读性、速度、可靠性)?
using (TransactionScope _scope = new TransactionScope())
{
using (SqlConnection _con = new SqlConnection(_connectionString))
{
....
}
_scope.Complete();
}
你更喜欢什么,为什么?
Marc
IDisposable
接口,并且当你创建该类的一个实例时,应该调用它的Dispose
方法。最简单的方法是使用using
块。我发现最好养成始终实现using
块的习惯。 - John Saunders