Завершает ли использование закрытие открытого соединения SQL

Если я оберну SQLConnection в Using, я должен закрыть его или обработчик конца будет обрабатывать его?

using cn as new system.data.sqlclient.sqlconnection()
    cn.open
    '{do a bunch of other stuff with commands and datareaders here}
    cn.close 'Do I need this?
end using 

6 ответов

Решение

Выход из блока using вызывает.Dispose() для рассматриваемого объекта (cn в вашем примере) который для SqlConnection закроет соединение и любые открытые ресурсы.

Точнее, вызов Dispose или Close помечает базовое физическое соединение как "Не используется", но на самом деле не закрывает его. Соединение "Не используется", которое еще не закрыто физически, таким образом, доступно для объединения. Следовательно, вызов Dispose вернет соединение в пул соединений.

Согласно MSDN, вам не нужно закрывать заявление.

"Следующий пример создает SqlConnection, открывает его, отображает некоторые его свойства. Соединение автоматически закрывается в конце блока using". - http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

В то время как метод Dispose в SQL закрывает соединение (в конце концов, по словам Дарина), вы должны оставить там вызов Close. Причина в том, что вы полагаетесь на базовую реализацию Dispose для вызова close. Также видеть открытие без закрытия - это все равно, что видеть новое без удаления для тех из нас, кто программировал на неуправляемых языках. Это кодовый запах для меня.

"Блок Using ведет себя как конструкция Try... finally, в которой блок Try использует ресурсы, а блок finally избавляется от них. Поэтому блок Using гарантирует удаление ресурсов независимо от того, как вы выходите из блока. Это верно даже в случае необработанного исключения, за исключением StackruException. "
https://msdn.microsoft.com/en-us/library/htd05whh.aspx

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

Try
    SqlConnection cn as new system.data.sqlclient.sqlconnection()
    cn.open
    '{do a bunch of other stuff with commands and datareaders here}
    cn.close 'Do I need this?
Finally
    cn.Dispose()
End Try

Предполагается, что Dispose позаботится об очистке всего ресурса, в случае соединений он закроет его.

Другие вопросы по тегам