[C#] Каков надлежащий способ обеспечить, чтобы соединение с SQL было закрыто при вызове исключения?


Answers

.NET Framework поддерживает пул соединений по какой-либо причине. Доверяй это! :) Вам не нужно писать столько кода, чтобы подключиться к базе данных и освободить соединение.

Вы можете просто использовать инструкцию 'using' и будьте уверены, что 'IDBConnection.Release ()' закроет соединение для вас.

Высокоразвитые «решения», как правило, приводят к ошибкам. Просто лучше.

Question

Я использую шаблон, который часто выглядит примерно так. Мне интересно, хорошо ли это или есть лучшая практика, которую я здесь не применяю.

В частности, мне интересно; в случае, если выбрано исключение, есть код, который у меня есть в блоке finally, достаточный для обеспечения надлежащего закрытия соединения?

public class SomeDataClass : IDisposable
{
    private SqlConnection _conn;

    //constructors and methods

    private DoSomethingWithTheSqlConnection()
    {
        //some code excluded for brevity

        try
        {
            using (SqlCommand cmd = new SqlCommand(SqlQuery.CountSomething, _SqlConnection))
            {
                _SqlConnection.Open();
                countOfSomething = Convert.ToInt32(cmd.ExecuteScalar());
            }
        }
        finally
        {
            //is this the best way?
            if (_SqlConnection.State == ConnectionState.Closed)
                _SqlConnection.Close();
        }

        //some code excluded for brevity
    }

    public Dispose()
    {
        _conn.Dispose();
    }
}



нет необходимости в попытке. Наконец, вокруг «использования», использование IS пытается ...




Я предполагаю, что с помощью «_SqlConnection.State == ConnectionState.Closed» вы имели в виду! =.

Это, безусловно, будет работать. Я думаю, что более традиционно содержать объект соединения внутри оператора using, но то, что у вас есть, является хорошим, если вы хотите по какой-то причине повторно использовать один и тот же объект соединения.

Однако одна вещь, которую вы обязательно должны изменить, - это метод Dispose (). Вы не должны ссылаться на объект соединения в распоряжении, потому что он, возможно, уже был финализирован в этой точке. Вместо этого вы должны следовать рекомендуемому шаблону Dispose.




См. Этот вопрос для ответа:

Закрыть и удалить - что звонить?

Если ваше время соединения - это один вызов метода, using функцию использования языка, чтобы обеспечить правильную очистку соединения. Хотя блок try/finally функционально одинаков, он требует большего количества кода, а IMO менее читабельна. Нет необходимости проверять состояние соединения, вы можете вызвать Dispose независимо, и он будет обрабатывать очистку соединения.

Если срок службы вашего соединения соответствует времени жизни содержащего класса, тогда реализуйте IDisposable и очистите соединение в Dispose .