c# - 为什么要对 SqlTransaction 使用 using 语句?

标签 c# using-statement sqltransaction system.data system.data.sqlclient

我遇到了一些与我在代码中使用的 SqlTransaction 有关的问题。在我的谷歌搜索中,我看到很多人使用带有 SqlTransaction 的 using 语句。

将这种类型的语句与 SqlTransaction 一起使用有什么好处和/或区别?

using (SqlConnection cn = new SqlConnection())
{
     using (SqlTransaction tr = cn.BeginTransaction())
     {
      //some code
      tr.Commit();
     }
}

目前我的代码是这样的:

SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"]);
cn.Open();
SqlTransaction tr = cn.BeginTransaction();

try
{
     //some code
     tr.Commit();
     cn.Close();
}
catch(Exception ex)
{
      tr.Rollback();
      cn.Close();
      throw ex;
}

一种方式相对于另一种方式的优势是什么?

最佳答案

using 语句应该在你每次创建一个实现IDisposable 的类的实例时使用在一个 block 的范围内。它确保在该实例上调用 Dispose() 方法,无论是否抛出异常。

特别是,您的代码仅捕获托管异常,然后通过抛出新异常而不是重新抛出现有异常来销毁堆栈帧。

正确的做法是:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"])) {
    cn.Open();
    using (SqlTransaction tr = cn.BeginTransaction()) {
        //some code
        tr.Commit();
    }
}

请注意,如果您的类具有实现 IDisposable 的类型的实例成员,那么您的类必须自己实现 IDisposable,并在其自己的 期间释放这些成员Dispose() 调用。

关于c# - 为什么要对 SqlTransaction 使用 using 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1127830/

相关文章:

c# - 有没有办法让 using 语句带有动态创建的目标?

c# - SqlTransaction 支持多个 SqlConnections

c# - 此事务是否正在为我回滚?

java - Sybase 中的 JDBC 事务控制

c# - 如何在一定时间后自动删除sql server中的记录

c# - ASP.NET 4.0 单选按钮选中更改事件仅触发一次

c# - 是否可以对具有显式实现的接口(interface)属性的类进行 json 序列化?

C# Lambda => 会产生垃圾吗?

c# - 在单个 'IDisposable' 语句中嵌套 'using'

c# - 抛出类型为 'System.OutOfMemoryException' 的异常。使用 IDataReader 时的 C#