Что произойдет, если вы закроете SqlConnection перед SqlDataReader?

2

Что произойдет, если вы вызовете Close() в объекте SqlConnection, прежде чем вы вызовете Close() в SqlDataReader, используя это соединение?

На самом деле, я действительно хочу знать, имеет ли дело порядок, в котором вы их закрываете. Вызывает ли SqlConnection.Close() полностью закрытие соединения или будет оставаться открытым, если вы не вызываете Close() на SqlDataReader, используя это соединение?

Извините за несколько вопросов, но я не думаю, что действительно понимаю, как работает закрытие соединений.

Теги:
database

3 ответа

12
Лучший ответ

Он закроет соединение (возвращает его в пул), а SqlDataReader выкинет исключение (System.InvalidOperationException) в случае, если оно будет использоваться позже.

  • 1
    Очень быстрый ответ +1
  • 0
    Итак, есть ли причина беспокоиться о закрытии SqlDataReader, если вы просто собираетесь закрыть SqlConnection сразу после этого? Похоже, что безопасно закрыть только SqlConnection. Это так?
Показать ещё 2 комментария
8

Вместо того, чтобы беспокоиться о порядке их закрытия, почему бы не обернуть их использованием операторов.

// 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.

  • 0
    Можно ли использовать операторы «использование» в .NET 2.0?
  • 0
    Да, операторы using были в C # в рамках 1.1 и в VB в рамках 2.0.
3

Фактическое соединение с базой данных будет закрыто (возвращено пулу) при закрытии/удалении объекта SqlConnection, поэтому ресурсы базы данных будут безопасными.

Однако вам также следует закрыть/удалить SqlDataReader, иначе он будет ссылаться на объект SqlConnection, сохраняя их оба в памяти. В конце концов финализатор будет располагать объект SqlDataReader, если вы этого не сделаете, а затем объект SqlConnection также может быть собран, но вы не можете контролировать, когда это произойдет.

SqlDataReader можно частично использовать после того, как вы закрыли соединение, но ничего, на что вы действительно можете положиться. У него все еще есть некоторые данные в нем, поэтому некоторые операции могут работать, но все, что требует больше данных из базы данных, вызовет исключение.

  • 0
    Круто, спасибо за подробное объяснение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню