如果您已经关闭了SqlConnection,是否需要关闭/处理SqlDataReader?

Bri*_*ian 4 c# sql dispose sqlconnection sqldatareader

我注意到了这个问题,但我的问题更加具体.

使用是否有任何好处

using (SqlConnection conn = new SqlConnection(conStr))
{
     using (SqlCommand command = new SqlCommand())
     {
        // dostuff
     } 
}
Run Code Online (Sandbox Code Playgroud)

代替

using (SqlConnection conn = new SqlConnection(conStr))
{
     SqlCommand command = new SqlCommand();
     // dostuff
}
Run Code Online (Sandbox Code Playgroud)

显然,如果您计划使用相同的连接运行多个命令,这很重要,因为关闭a SqlDataReader比关闭并重新打开连接更有效(调用conn.Close();conn.Open();也会释放连接).

我看到许多人坚持认为未能关闭SqlDataReader手段会留下开放的连接资源,但这不仅适用于您不关闭连接的情况吗?

Jam*_*Ide 16

在我看来,这里有两条规则:

  1. 实现IDisposable的类应该包含在一个using块中.
  2. 您不应该依赖类的IDisposable实现来忽略规则1.

也就是说,即使您知道处置连接对象负责处理其关联的命令对象,您也不应该依赖此行为.

顺便说一下,可以以更干净的方式使用块来嵌套:

using (SqlConnection conn = new SqlConnection(conStr))
using (SqlCommand command = new SqlCommand())
{
    // dostuff
}
Run Code Online (Sandbox Code Playgroud)

我会用

SqlCommand command = conn.CreateCommand();
Run Code Online (Sandbox Code Playgroud)

而不是创建一个新的SqlCommand,然后将其与连接相关联.

  • 正如我所说的那样. (2认同)

Aar*_*ght 5

从技术上讲,它不是必需的; 关闭a SqlConnection应该销毁SqlDataReader正在使用的任何资源.反之亦然; 你不需要DisposeSqlConnection,如果你配置一个SqlDataReader是与创建CommandBehavior.CloseConnection.

实际上,当一个类实现时IDisposable,你应该在Dispose它完成它时使用它.框架类的实现细节随时可能发生变化,除非文档特别概述Dispose了实例不需要的情况,否则将来某些更改/更新将导致您的代码具有资源泄漏.

这真的没有额外的努力 - 所以只需将它包装在一个using块中.