【问题标题】:Is there any need to close a DbConnection if a using clause is used? [duplicate]如果使用 using 子句,是否需要关闭 DbConnection? [复制]
【发布时间】:2012-08-15 13:36:38
【问题描述】:

可能重复:
Will a using block close a database connection?

下面的db.Close()是不必要的吗?

using (DbConnection db = GetDbConnection())
{
   // do data-access stuff
   // ...

   db.Close();
}

【问题讨论】:

  • 否,在 DBConnection 中的 dispose 方法的实现中使用,调用 db.Close()。没必要
  • 查看 IDisposable 的精彩解释:stackoverflow.com/a/538238/110933

标签: c# .net ado.net using dbconnection


【解决方案1】:

如果使用 using 子句,是否需要关闭 DbConnection?

不,如果使用 using 子句,是否不需要关闭 DbConnection?

是的,这里没有必要,因为当using 的范围结束时,连接将处理关闭和释放所有内存的意思。

由于DBConnection实现了IDisposable接口,所以DBConnectionDispose方法中有close函数。

但如果有些行在关闭行之后,那么它很有用

using (DbConnection db = GetDbConnection())
{
  // do data-access stuff
  // ...

  db.Close(); //Useless
}

但这里有用

using (DbConnection db = GetDbConnection())
{
  // do data-access stuff
  // ...

  db.Close(); //Useful

 // Some more code
}

在这种情况下你可以这样做

using (DbConnection db = GetDbConnection())
{
  // do data-access stuff
  // ...

}

// Some more code which was previously inside using section.

【讨论】:

  • +1 用于手动关闭的漂亮设计,以防存在更多不使用连接的代码。但是在这种情况下,最好不要将该代码包含在 using 块中。
  • @Aphelion: 是的,当然 Close() 下面的代码不应该在块中
  • 为什么 db.CLose() 下面的一些代码很有用?
  • @CuongLe:可能是一个代码,它适用于通过该连接触发一些查询后获取的值。
  • @NikhilAgrawal 好点。在这种情况下,我建议将结果存储在using 范围之外。
【解决方案2】:

只是为了确保我已经检查了代码:)

   protected override void Dispose(bool disposing)
    {
      if (disposing)
      {
        this._userConnectionOptions = (DbConnectionOptions) null;
        this._poolGroup = (DbConnectionPoolGroup) null;
        this.Close();
      }
      this.DisposeMe(disposing);
      base.Dispose(disposing);
    }

这是继承自DbConnectionSqlConnection 的实现。如您所见,有 this.Close() 方法:)

【讨论】:

  • 我想在这里,using 语句调用Dispose()Dispose(bool disposing)
  • @Aphelion:请问您也可以回答这个问题吗?
  • @CuongLe 它将调用Dispose(),这是公开的。然后它的实现将调用Dispose(true)
【解决方案3】:

据我所知,当调用Dispose() 方法时,会自动执行Close()
所以这里不需要db.Close();

【讨论】:

    【解决方案4】:

    在右大括号处调用Dispose()

    我认为在DbConnectionDispose 方法也会检查连接是否关闭。 所以不,这可能没有必要,但我个人认为这是一种很好的做法,可以提高可读性,并且不会影响性能,因为Close 会以一种或另一种方式调用。

    【讨论】:

      【解决方案5】:

      SqlConnection(派生自DbConnection)类的dispose实现中提取代码:

      public void Dispose()
      {
         Dispose(true);
      }
      
      protected override void Dispose(bool disposing)
      {
        if (disposing)
        {
           this.Close();
        }
        base.Dispose(disposing);
      }
      

      using 关键字使用IDisposable 接口。上面的方法是方法实现。它将关闭连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多