[c#] SQLConnection이 삭제되기 전에 Close ()해야합니까?
Disposable objects에 대한 다른 질문 에 따라 using 블록이 끝나기 전에 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();
}
답변
using 블록이 있으므로 SQLCommand의 Dispose 메서드가 호출되고 연결이 닫힙니다.
// 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);
}
답변
.NET Reflector 사용에서 SqlConnection 분해 :
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
Dispose () 내부에서 Close ()를 호출합니다.
답변
using 키워드는 연결을 올바르게 종료하므로 Close에 대한 추가 호출이 필요하지 않습니다.
SQL Server 연결 풀링 에 대한 MSDN 기사에서 :
“연결이 풀로 반환되도록 연결 사용이 끝나면 항상 연결을 닫는 것이 좋습니다. 연결 개체의 Close 또는 Dispose 메서드를 사용하거나 내부의 모든 연결을 열면됩니다.
C #에서 문 사용 “
.NET Reflector를 사용한 SqlConnection.Dispose의 실제 구현은 다음과 같습니다.
// 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()
어쨌든 Using 블록에서 전화 를 받으면을 (를) 호출 할 필요가 없습니다 Close()
.
답변
아니요, Dispose를 호출하기 전에 연결을 닫을 필요는 없습니다.
SQLConnections와 같은 일부 개체는 Close를 호출 한 후에 다시 사용할 수 있지만 Dispose를 호출 한 후에는 사용할 수 없습니다. 다른 개체의 경우 Close를 호출하는 것은 Dispose를 호출하는 것과 같습니다. (ManualResetEvent 및 Streams는 이와 같이 작동한다고 생각합니다)