.Net SqlCommand.ExecuteReader закрывает соединение?
-
03-07-2019 - |
Вопрос
В этом предложении:
myCommand.ExecuteReader(CommandBehavior.CloseConnection)
закрывает ли соединение в случае исключения?
Решение
Существует множество способов ошибочного выполнения команды.
В конце концов, это метод Close для чтения данных, который закрывает соединение при условии, что ничего не пошло не так раньше.
Если в ExecuteReader или в каком-либо из его вызванных методов возникает исключение, то перед тем, как будет создан фактический объект DataReader, нет, соединение не будет закрыто.
В случае исключения я бы не стал доверять закрытию соединения.
Другие советы
Самый безопасный способ сделать " нормальный " запрос
using (var conn = new SqlConnection("..."))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "...";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// ...
}
}
}
}
Исключения могут быть обнаружены вне этого кода.
Это зависит от того, где происходит исключение!
Если вы правильно структурируете свой try catch, все будет хорошо.
Например:
SqlCommand myCommand = new SqlCommand();
try
{
myCommand.dostuff();
}
catch(Exception ex)
{
// display error message
}
finally
{
myCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
Если строка myCommand.ExecuteReader (CommandBehavior.CloseConnection) завершится неудачно (возможно, база данных отключена?), то соединение не может быть закрыто программным способом.