Закрывается ли соединение, когда команда удаляется и соединение определяется непосредственно в команде?

Я знаю, что существует множество примеров, когда определяется SqlConnection, а затем определяется SqlCommand, как в блоках Using:

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
}

person Dela    schedule 04.01.2009    source источник


Ответы (4)


Нет, SqlCommand никогда не пытается закрыть / удалить соединение.

person Robert C. Barth    schedule 04.01.2009

Нет, объект подключения не будет удален, пока вы не удалите его явно. Но я рекомендую по возможности использовать использование блоков.

person milot    schedule 04.01.2009

Он не закрывает соединение, вам нужно либо закрыть его самостоятельно, либо поставить в свой с помощью statment.

Также вот совет, чтобы сделать ваши using блоки более читабельными:

using (var conn = new SqlConnection(connString))
using (var cmd = new SqlCommand())
{
    cmd.Connection = conn;
}
person Andrew Hare    schedule 04.01.2009
comment
Очень милый Эндрю, я никогда раньше не видел такого комбо. Придется попробовать. Я всегда вкладываю несколько блоков using, что временами затрудняет чтение кода. - person barneytron; 04.01.2009
comment
ИМО, это делает их МЕНЬШЕ читабельными. Я в порядке с потерей кудряшек, только не с той частью, где вы не делаете отступы внутренними. - person Robert C. Barth; 06.01.2009
comment
Мне определенно НЕ нравится терять фигурные скобки и вложенность - доказано, что это приводит к большему количеству ошибок в коде, особенно когда неаккуратный JR начинает возиться с разными вещами. - person hajikelist; 09.06.2015

@milot

Но я рекомендую по возможности использовать блоки.

Использование блоков - это хорошо, но бесполезно при работе с объектами, отличными от IDisposable, поэтому это может сбивать с толку, если вы используете использование блоков где угодно.

Будьте осторожны, поскольку ваши объекты могут не удаляться, если они не реализуют IDisposable.

Надеюсь это поможет.

person Yoann. B    schedule 04.01.2009
comment
Хм, я не думаю, что компилятор позволит вам использовать блоки для объектов, которые не реализуют IDisposable. Я смутно помню, что в прошлый раз, когда я пробовал это, то получал ошибку компиляции, это было несколько лет назад. - person barneytron; 04.01.2009
comment
Using Using Blocks is nice but useless when working with non IDisposable Objects, вы не можете использовать using с объектами, отличными от IDisposable. - person Habib; 19.02.2014