当命令被处理且连接直接在命令上定义时,连接是否会关闭?

8

我知道很多例子都是在Using块中定义了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
}
4个回答

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

5
不,连接对象不会在您没有明确释放它之前被释放。但我的建议是尽可能使用“using块”。

5

它不会关闭连接,你需要自己关闭它或将其放在自己的using语句中。

此外,这里有一个技巧可以使你的using块更易读:

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

非常好的Andrew,我以前从未见过这种组合。我得试一试。我总是嵌套多个“using块”,这有时会使代码难以阅读。 - barneytron
1
在我看来,这会让它们变得更不易读。我可以接受去掉花括号,但不能去掉不缩进内部使用的部分。 - Robert C. Barth
我绝对不赞成失去花括号和嵌套 - 这已被证明会导致更容易出错的代码,特别是当粗心的初级程序员开始胡乱搞时。 - hajikelist

-2

@milot

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

使用Using块很好,但在处理非IDisposable对象时是无用的,如果您在任何地方使用Using块,则可能会导致混淆。

请注意,如果对象不实现IDisposable,则可能不会被处理。

希望这可以帮助您。


3
嗯,我认为编译器不会允许您对未实现IDisposable接口的对象使用“using”块。我依稀记得上次我尝试这样做时出现了编译错误,那是几年前的事了。 - barneytron
3
使用Using块虽然方便,但是在处理非IDisposable对象时毫无用处。不能对非IDisposable对象使用using。 - Habib

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