.Net SqlCommand.ExecuteReader закрывает соединение? - PullRequest
4 голосов
/ 21 октября 2008

В этом предложении:

myCommand.ExecuteReader(CommandBehavior.CloseConnection)

закрывает ли соединение в случае исключения?

Ответы [ 3 ]

7 голосов
/ 21 октября 2008

Самый безопасный способ сделать «нормальный» запрос -

using (var conn = new SqlConnection("..."))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "...";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // ...
            }
        }
    }
}

Исключения могут быть обнаружены вне этого кода.

3 голосов
/ 21 октября 2008

Есть много способов, которыми команда может пойти не так.

В конце концов, это метод Close для считывателя данных, который закрывает соединение при условии, что ничего не пошло не так прежде.

Если есть исключение, которое возникает внутри ExecuteReader или любого из его вызванных методов, до того, как фактический объект DataReader будет создан, то нет, соединение не будет закрыто.

В случае исключения я бы не стал доверять закрытию соединения.

0 голосов
/ 21 октября 2008

Зависит от того, где происходит исключение!

Если вы правильно структурируете свой try catch, все будет хорошо.

Например:

SqlCommand myCommand = new SqlCommand();

try
{
   myCommand.dostuff();
}
catch(Exception ex)
{
  // display error message
}
finally
{
  myCommand.ExecuteReader(CommandBehavior.CloseConnection);
}

Если произошла ошибка строки myCommand.ExecuteReader (CommandBehavior.CloseConnection) (возможно, база данных отключена?), То соединение не может быть закрыто программно.

...