Что произойдет, если вы вызовете Close() в объекте SqlConnection, прежде чем вы вызовете Close() в SqlDataReader, используя это соединение?
На самом деле, я действительно хочу знать, имеет ли дело порядок, в котором вы их закрываете. Вызывает ли SqlConnection.Close() полностью закрытие соединения или будет оставаться открытым, если вы не вызываете Close() на SqlDataReader, используя это соединение?
Извините за несколько вопросов, но я не думаю, что действительно понимаю, как работает закрытие соединений.
Он закроет соединение (возвращает его в пул), а SqlDataReader
выкинет исключение (System.InvalidOperationException
) в случае, если оно будет использоваться позже.
Вместо того, чтобы беспокоиться о порядке их закрытия, почему бы не обернуть их использованием операторов.
// the following code has parts left out for brevity...
using(var conn = new SqlConnection( ... ))
using(var cmd = new SqlCommand( ... ))
{
conn.Open();
using(var reader = cmd.ExecuteReader())
{
// do whatever with the reader here...
}
}
используемые операторы гарантируют, что ваши объекты будут закрыты, и в правильном порядке, если вы их соответствующим образом вложите. Подробнее см. http://msdn.microsoft.com/en-us/library/yh598w02.aspx.
Фактическое соединение с базой данных будет закрыто (возвращено пулу) при закрытии/удалении объекта SqlConnection
, поэтому ресурсы базы данных будут безопасными.
Однако вам также следует закрыть/удалить SqlDataReader
, иначе он будет ссылаться на объект SqlConnection
, сохраняя их оба в памяти. В конце концов финализатор будет располагать объект SqlDataReader
, если вы этого не сделаете, а затем объект SqlConnection
также может быть собран, но вы не можете контролировать, когда это произойдет.
SqlDataReader
можно частично использовать после того, как вы закрыли соединение, но ничего, на что вы действительно можете положиться. У него все еще есть некоторые данные в нем, поэтому некоторые операции могут работать, но все, что требует больше данных из базы данных, вызовет исключение.