Разница в объявлении 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) гарантирует, что объект будет расположен независимо от того, как вы выходите из блока.

Другие вопросы по тегам