Закрытие SqlConnection и SqlCommand С#

В моем DAL я пишу такие запросы:

using(SQLConnection conn = "connection string here")
{
    SQLCommand cmd = new ("sql query", conn);
    // execute it blah blah
}

Теперь мне пришло в голову, что я явно не закрываю объект SQLCommand. Теперь я знаю, что блок "using" будет заботиться о объекте SQLConnection, но будет ли он также заботиться об объекте SQLCommand? Если нет, то у меня есть серьезная проблема. Я должен был бы включить "использование" в SQLCommand на тысячи и тысячи строк кода или сделать cmd.Close() для сотен методов. Скажите, пожалуйста, что если использование или закрытие команды обеспечит лучшее управление памятью веб-приложения?

Ответы

Ответ 1

Нет, оператор using не позаботится о команде.

Вы должны также обернуть команды с помощью операторов using, так как это правильно вызовет на них Dispose:

using(SQLConnection conn = 'connection string here')
{
    using(SQLCommand cmd = new ('sql query', conn))
    {
        //execute it blah blah
    }
}

Ответ 2

SqlConnection не знает о SqlCommand, поэтому вы должны закрыть его самостоятельно:

using (SqlConnection conn = new SqlConnection("connection string here"))
using (SqlCommand cmd = new SqlCommand("sql query", conn))
{
    // execute it blah blah
}

Ответ 3

Он не будет обрабатывать SqlCommand, но SqlCommand в конечном итоге будет обработан сборщиком мусора. Я имею тенденцию делать следующее:

using (SqlConn conn ... )
using (SqlComm comm ... )
{
    conn.Open();
}

Укладка операторов using здесь будет обрабатывать оба.