使用“using”语句时,ADO.NET如何关闭连接?

35

我正在以这种方式访问SQL Server数据库

  using (SqlConnection con = new SqlConnection(//connection string)
  {
    using (SqlCommand cmd = new SqlCommand(storedProcname, con))
     {
       try{
           con.open();
           //data reader code
       }
       catch
       {

       }
     }
  }

我是否需要关闭或释放SqlCommand对象,还是使用using语句会替我处理?我只是不想让连接一直保持打开状态。谢谢。

7个回答

63
using 会为你处理这个问题。在底层,SqlConnection.Dispose() 调用 SqlConnection.Close() 方法,而 SqlCommand.Dispose() 则调用 SqlCommand.Close()
作为额外的背景,using 语句是一个 try ... finally 的语法糖,它会在 finally 中处理 IDisposable 对象的释放问题。

3
它会处理它 - 但我仍然会明确地关闭它并仅将using()块用作我忘记时的“备份”。 - marc_s
1
非常感谢您!也感谢所有回复的人! - twal
依赖这样的“特性”可能是危险和令人困惑的。我仍然会像marc_s一样明确地关闭它。说实话,我也会明确地处理它,并且只在我想要处理它的地方处理它。 - ThunderGr

12

顺便提一下,你可以按照以下方式使代码更加简洁和易读:

 using (SqlConnection con = new SqlConnection(/*connection string*/))
 using (SqlCommand cmd = new SqlCommand(storedProcname, con))
 {
    //...
 }

4
正如Phil所说,使用using子句可以为您解决这个问题。在编译时,它会将连接创建包装在try..finally中,并将连接处理调用放置在finally中。
有关更多信息,请参见msdn上的using语句文章

3

是的,你的代码会关闭连接,但通常意味着将其释放回连接池,以便稍后真正关闭。

如果你执行此代码片段,然后执行 sp_who 并观察到你的连接仍在那里,那就是为什么。

如果你绝对需要真正关闭连接(确实是一个边缘案例),那么请使用 SqlConnection 的 ClearAllPools 静态方法。


2
使用Using关键字会自动为您关闭连接,因此您不需要每次在结尾处调用connection.close()

1
我不太明白,这与被接受的答案有什么区别。你能详细解释一下吗? - Nicktar

1

当作用域

using (SqlConnection con = new SqlConnection(//connection string) 
{
}

程序执行完毕后,连接将被运行环境自动处理掉。所以不必担心。


0
我认为SqlCommand不需要使用"using"。仅对SqlConnection使用"using"就足够了。 实际上,你的连接已经被提交到连接池中了。

4
不行 - 你需要为每个可处理对象使用 using() - 单独使用 using(SqlConnection.....) 无法处理你的 SqlCommand - marc_s
6
任何实现IDisposable接口的对象都应该放在using语句块中。这是一种好的编程习惯,可以快速发现代码是否正确。 - NotMe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接