Подтвердить что ты не робот

Соединение не было закрыто, текущее состояние соединения открыто

Я пишу приложение ASP.NET. В моем datalayer соединение sql открывается и закрывается до и после запроса. SqlConnection хранится как частное поле одного класса. Каждый вызов базы данных в классе использует ту же структуру:

        conn.Open();

        try
        {
            // database querying here
        }
        finally
        {
            conn.Close();
        }

Тем не менее, в очень редких случаях я получаю исключение. Связь не была закрыта. Текущее состояние соединения открыто. Невозможно воспроизвести проблему, поскольку она возникает очень редко из разных частей кода. В моем приложении есть несколько потоков, но новые потоки также создают новые классы слоев данных и, следовательно, новые объекты подключения.

Я не понимаю, как можно подключить соединение, открытое с помощью приведенного выше кода. Не следует ли закрывать соединение после открытия, исключая возможность исключения из вышеперечисленного?

4b9b3361

Ответ 1

Вероятно, в блок try, который вы не обрабатываете, генерируется исключение. См. Это примечание в MSDN для try-finally:

В обработанном исключении гарантируется, что соответствующий блок finally будет запущен. Однако, если исключение необработанно, выполнение блока finally зависит от того, как запускается операция исключения размотки.

Я бы рекомендовал обернуть соединение в блоке using в любом случае:

using (SqlConnection connection = new SqlConnection(connectionString))
{
     //etc...
}

В качестве альтернативы добавьте блок catch в try-finally:

    conn.Open();

    try
    {

    }
    catch
    {

    }
    finally
    {
        conn.Close();
    }

Ответ 2

вы должны закрыть соединения, как только закончите работу. Попробуйте открыть соединения в кратчайшие сроки. Однако лучше использовать с помощью, он вызовет метод Dispose даже в случае исключений.

using (SqlConnection conn= new SqlConnection(conStr))
{
     //etc...
}

ИЛИ

1) Откройте соединение

2) Доступ к базе данных

3) Закройте соединение

 //conn.Open();

        try
        {
          conn.Open();
          //Your Code

        }
        finally
        {
           conn.Close();   
           conn.Dispose();//Do not call this if you want to reuse the connection
        }