Должен ли я закрыть () SQLConnection до его удаления?
На мой другой вопрос здесь об Устранимых объектах, мы должны вызвать Close() до конца использования блока?
using (SqlConnection connection = new SqlConnection())
using (SqlCommand command = new SqlCommand())
{
command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)";
command.CommandType = System.Data.CommandType.Text;
connection.Open();
command.ExecuteNonQuery();
// Is this call necessary?
connection.Close();
}
8 ответов
Поскольку у вас есть блок using, будет вызван метод Dispose для SQLCommand, и он закроет соединение:
// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
Разборка SqlConnection с использованием .NET Reflector:
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
Он вызывает Close() внутри Dispose()
Ключевое слово using правильно закроет соединение, поэтому дополнительный вызов Close не требуется.
Из статьи MSDN о пуле соединений SQL Server:
"Мы настоятельно рекомендуем всегда закрывать соединение по окончании его использования, чтобы соединение было возвращено в пул. Это можно сделать с помощью методов Close или Dispose объекта Connection или путем открытия всех соединений внутри используя заявление в C#"
Фактическая реализация SqlConnection.Dispose с использованием .NET Reflector выглядит следующим образом:
// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
Используя Reflector, вы можете увидеть, что Dispose
метод SqlConnection
на самом деле звонит Close()
;
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
Нет, вызов Dispose() в SqlConnection также вызывает Close ().
Нет, с использованием блочных вызовов Dispose()
для вас все равно, так что звонить не нужно Close()
,
Нет, нет необходимости закрывать соединение перед вызовом Dispose.
Некоторые объекты (например, SQLConnections) можно использовать повторно после вызова Close, но не после вызова Dispose. Для других объектов вызов Close аналогичен вызову Dispose. (ManualResetEvent и Streams, я думаю, ведут себя так)
Нет, класс SqlConnection наследует от IDisposable, и когда встречается конец использования (для объекта соединения), он автоматически вызывает Dispose для класса SqlConnection.