【问题标题】:Does connection close when command is disposed and the connection is defined directly on the command?处理命令并直接在命令上定义连接时连接是否关闭?
【发布时间】:2010-09-29 10:35:40
【问题描述】:

我知道在使用块中定义了 SqlConnection 然后定义了 SqlCommand 的例子很多:

using (var conn = new SqlConnection(connString)) {
      using (var cmd = new SqlCommand()) {
        cmd.Connection = conn;
        //open the connection
      }
}

我的问题:如果我直接在SqlCommand上定义连接,当命令被释放时连接会关闭吗?

using (var cmd = new SqlCommand()) {
      cmd.Connection = new SqlConnection(connString);
      //open the connection
}

【问题讨论】:

    标签: c# using using-statement


    【解决方案1】:

    不,SqlCommand 从不尝试关闭/释放连接。

    【讨论】:

      【解决方案2】:

      不,连接对象在您明确处置之前不会被处置。但我的建议是尽可能使用using blocks

      【讨论】:

        【解决方案3】:

        它不会关闭连接,您需要自己关闭它或使用statment将其放入自己的。

        这里还有一个提示,可以让您的 using 块更具可读性:

        using (var conn = new SqlConnection(connString))
        using (var cmd = new SqlCommand())
        {
            cmd.Connection = conn;
        }
        

        【讨论】:

        • 非常好的安德鲁,我以前从未见过这种组合。将不得不试一试。我总是嵌套多个“使用块”,这有时会使代码更难阅读。
        • IMO,这使它们的可读性降低。我可以丢失卷曲,只是不是你没有缩进内部使用的部分。
        • 我绝对不同意丢失花括号和嵌套 - 事实证明这会导致更容易出错的代码,尤其是当 JR 开始使用杂乱无章的东西时。
        【解决方案4】:

        @米洛特

        但我的建议是尽可能使用 using 块。

        使用 Using Blocks 很好,但在处理非 IDisposable 对象时无用,因此如果您在任何地方使用 Using Blocks,这可能会令人困惑。

        请小心,因为如果您的对象不实现 IDisposable,则它们可能不会被处置。

        希望这会有所帮助。

        【讨论】:

        • 嗯,我认为编译器不会让您对未实现 IDisposable 的对象使用“使用”块。我依稀记得上次尝试时遇到了编译错误,那是几年前的事了。
        • Using Using Blocks is nice but useless when working with non IDisposable Objects,您不能using 与非IDisposable 对象一起使用。
        猜你喜欢
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2013-08-07
        • 2013-07-05
        相关资源
        最近更新 更多