В моем DAL я пишу запросы как это:
using(SQLConnection conn = "connection string here")
{
SQLCommand cmd = new ("sql query", conn);
// execute it blah blah
}
Теперь мне просто пришло в голову, что я явно не закрываю объект SQLCommand. Теперь я знаю, что блок 'использования' будет заботиться об объекте SQLConnection, но это будет также заботиться об объекте SQLCommand? Если не, чем у меня есть серьезная проблема. Я должен был бы вставить 'использование' на SQLCommand на тысячах и тысячах строк кода или сделать cmd. Близко () на сотнях методов. Скажите мне, который при включении использования или закрытия команды обеспечит лучшее управление памятью веб-приложения?
Нет, оператор using
не позаботится о команде.
Вы должны заключить команды в , используя также операторы
, так как это правильно вызовет для них Dispose
:
using(SQLConnection conn = 'connection string here')
{
using(SQLCommand cmd = new ('sql query', conn))
{
//execute it blah blah
}
}
Он не будет обрабатывать SqlCommand
, но SqlCommand
будет в конечном итоге обработан сборщиком мусора. Я обычно делаю следующее:
using (SqlConn conn ... )
using (SqlComm comm ... )
{
conn.Open();
}
Объединение здесь операторов using будет обрабатывать и то, и другое.
У SqlConnection
нет знаний о SqlCommand
, поэтому вы должны закрыть его самостоятельно:
using (SqlConnection conn = new SqlConnection("connection string here"))
using (SqlCommand cmd = new SqlCommand("sql query", conn))
{
// execute it blah blah
}