문제

이 접근 방식을 효율적으로 사용할 수 있습니까?

using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString))
{
    cmd.Connection.Open();
    // set up parameters and CommandType to StoredProcedure etc. etc.
    cmd.ExecuteNonQuery();
}

내 관심사는 다음과 같습니다.SqlCommand의 Dispose 메서드(using 블록을 종료할 때 호출됨)가 기본 SqlConnection 개체를 닫습니까?

도움이 되었습니까?

해결책

아니요, 폐기합니다. SqlCommand 연결에 영향을 미치지 않습니다.더 나은 접근 방식은 SqlConnection using 블록에서도 마찬가지입니다.

using (SqlConnection conn = new SqlConnection(connstring))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(cmdstring, conn))
    {
        cmd.ExecuteNonQuery();
    }
}

그렇지 않으면 연결을 사용하고 있던 명령이 삭제되었다는 사실로 인해 연결이 변경되지 않습니다(어쩌면 그것이 당신이 원하는 것일 수도 있습니다).그러나 연결도 폐기해야하며 명령보다 폐기하는 것이 더 중요하다는 것을 명심하십시오.

편집하다:

방금 이것을 테스트했습니다.

SqlConnection conn = new SqlConnection(connstring);
conn.Open();

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn))
{
    Console.WriteLine(cmd.ExecuteScalar().ToString());
}

conn.Dispose();  

첫 번째 명령은 using 블록이 종료될 때 삭제되었습니다.연결은 여전히 ​​열려 있고 두 번째 명령에 적합했습니다.

따라서 명령을 삭제해도 사용 중이던 연결이 삭제되지는 않습니다.

다른 팁

많은 SqlCommand가 동일한 SqlConnection을 (재)사용할 수 있으므로 SqlCommand.Dispose로는 충분하지 않습니다.SqlConnection에 집중하세요.

저는 이 패턴을 사용합니다.내 앱 어딘가에 다음과 같은 비공개 메서드가 있습니다.

private void DisposeCommand(SqlCommand cmd)
{
    try
    {
        if (cmd != null)
        {
            if (cmd.Connection != null)
            {
                cmd.Connection.Close();
                cmd.Connection.Dispose();
            }
            cmd.Dispose();
        }
    }
    catch { } //don't blow up
}

그런 다음 항상 try 블록에 SQL 명령과 연결을 만들고(using 블록에 래핑되지 않음) 항상 다음과 같은 finally 블록을 갖습니다.

    finally
    {
        DisposeCommand(cmd);
    }

명령 개체의 속성인 연결 개체는 이 상황에서 using 블록을 어색하게 만듭니다. 하지만 이 패턴을 사용하면 코드를 복잡하게 하지 않고 작업을 완료할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top