代码之家  ›  专栏  ›  技术社区  ›  Brian

如果已经关闭了sqlconnection,是否需要关闭/释放sqldatareader?

  •  4
  • Brian  · 技术社区  · 16 年前

    我注意到了 This question 但我的问题更具体一点。

    使用有什么好处吗

    using (SqlConnection conn = new SqlConnection(conStr))
    {
         using (SqlCommand command = new SqlCommand())
         {
            // dostuff
         } 
    }
    

    而不是

    using (SqlConnection conn = new SqlConnection(conStr))
    {
         SqlCommand command = new SqlCommand();
         // dostuff
    }
    

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

    我看到很多人坚持不关闭 数据阅读器 意味着要保留开放的连接资源,但这不只是在不关闭连接时才适用吗?

    5 回复  |  直到 9 年前
        1
  •  16
  •   Jamie Ide    16 年前

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

    1. 实现IDisposable的类应包装在 using 块。
    2. 您不应该依赖类的IDisposable实现来忽略规则1。

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

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

    using (SqlConnection conn = new SqlConnection(conStr))
    using (SqlCommand command = new SqlCommand())
    {
        // dostuff
    }
    

    我会用

    SqlCommand command = conn.CreateCommand();
    

    而不是创建一个新的sqlcommand,然后将其与连接关联。

        2
  •  5
  •   Aaronaught    16 年前

    技术上讲 不需要;关闭 SqlConnection 应该销毁 SqlDataReader 正在使用。反过来也一样,你不需要 Dispose 这个 连接对象 如果你处理了 数据阅读器 它是用 CommandBehavior.CloseConnection .

    实际上 不过,当一个类实现 IDisposable ,你应该 处置 当你完成它的时候。框架类的实现细节随时可能发生变化,除非文档专门概述了不需要 处置 例如,将来的一些更改/更新总是有可能导致代码发生资源泄漏。

    这真的不需要额外的努力-所以把它包在 using 块。

        3
  •  1
  •   Daniel DiPaolo    16 年前

    在很多情况下,这可能不是必需的,但出于某种原因,这是最佳实践。没有理由让资源持续存在于不再有用的地方。这个 using 构造有助于确保这一点。

        4
  •  0
  •   John    16 年前

    现在释放资源和稍后释放垃圾回收不是问题吗?

        5
  •  0
  •   Jerod Venema    9 年前

    这是有区别的。如果你创造 二 在那些没有打开/关闭连接的读卡器中,但是在使用第二个读卡器之前不要处理第一个读卡器,这样会出现一个冲突,说明连接已经与打开的读卡器相关联。