Я пытаюсь сделать общий вызов SQL, что привело меня к интересному вопросу. У меня есть метод, который выполняет SQL и возвращает SQLDataReader
.
private SqlDataReader ExecuteSql(SqlCommand command)
{
using (var connection = new SqlConnection(ConnectionText, Credentials))
{
command.Connection = connection;
connection.Open();
return command.ExecuteReader();
}
}
Вызывающая команда берет считыватель и правильно обрабатывает возвращенные данные. Однако, зная, что от читателя нужно избавиться, я заключил его в оператор using
.
using (SqlDataReader reader = ExecuteSql(command))
{
while (reader.Read())
{
try { ... }
catch(Exception e) { ... }
}
}
Я думаю, Dispose
следует вызывать на SqlDataReader
в конце using
оператор, несмотря на то, где в коде он был создан. Однако я не смог найти ничего, что конкретно подтверждает это.
Обобщая, может ли оператор using
быть успешно использован для объекта, который был создан в другом месте кода?
Какпримечание, я понимаю, что если SqlDataReader
был создан как объект в методе ExecuteSql
, а не возвращен напрямую, то может возникнуть проблема с тем, что он вызывает исключение в методе ExecuteSql
и неутилизировать.