[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);
}


답변

아니요, SqlConnection에서 Dispose ()를 호출하면 Close ()도 호출됩니다.

MSDN-SqlConnection.Dispose ()


답변

아니요, Dispose()어쨌든 Using 블록에서 전화 를 받으면을 (를) 호출 할 필요가 없습니다 Close().


답변

아니요, Dispose를 호출하기 전에 연결을 닫을 필요는 없습니다.

SQLConnections와 같은 일부 개체는 Close를 호출 한 후에 다시 사용할 수 있지만 Dispose를 호출 한 후에는 사용할 수 없습니다. 다른 개체의 경우 Close를 호출하는 것은 Dispose를 호출하는 것과 같습니다. (ManualResetEvent 및 Streams는 이와 같이 작동한다고 생각합니다)