Разница в объявлении IDisposable члена в использовании блока или при использовании объявления блока?
У меня есть код ниже:
using (SqlCommand command = new SqlCommand())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Connection = new SqlConnection();
command.CommandText = "";
command.Parameters.Add(new SqlParameter("@ExperienceLevel", 3).Direction = System.Data.ParameterDirection.Input);
SqlDataReader dataReader = command.ExecuteReader();
}
Есть ли какое-либо функциональное влияние в объявлении SqlConnection, где я в настоящее время объявляю его, а не так?
using (SqlCommand command = new SqlCommand())
using (SqlConnection connection = new SqlConnection())
Спасибо
4 ответа
Да, есть разница. Утилизация SqlCommand
не удаляет автоматически SqlConnection
это связано с. Вы можете пропустить соединения таким образом, и это будет мешать пулу соединений ADO.NET; если вы посмотрите на активность сервера базы данных во время выполнения этого кода, вы увидите, что новые соединения открываются, а не закрываются.
Вы всегда должны использовать вторую версию. На самом деле, SqlConnection
объект тот, который вам действительно нужно Dispose
, Вы должны всегда располагать всем, что реализует IDisposable
как можно скорее, но не в состоянии распорядиться SqlConnection
особенно опасно.
Да, желательно использовать 2 блока, по 1 на ресурс.
В этом случае вы можете использовать только 1, но оно должно быть вокруг Соединения, а не вокруг Команды.
Но вы действительно не хотите знать или заботиться о таких деталях. Если класс реализует интерфейс IDispsoable, используйте его экземпляры в using() { }
заблокировать, если нет особой причины не делать этого.
Я использую следующий шаблон:
using(var connection = new SqlConnection("ConnectionName"))
using(var command = new SqlCommand())
{
command.Connection = connection;
// setup command
var reader = command.ExecuteReader();
// read from the reader
reader.Close();
}
Да, приведенный ниже код будет корректно распределять SqlConnection, а приведенный выше - нет. using
блок (реализован как try
...finally
) гарантирует, что объект будет расположен независимо от того, как вы выходите из блока.