SqlCommand.Dispose가 연결을 닫나요?
-
09-06-2019 - |
문제
이 접근 방식을 효율적으로 사용할 수 있습니까?
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 블록을 어색하게 만듭니다. 하지만 이 패턴을 사용하면 코드를 복잡하게 하지 않고 작업을 완료할 수 있습니다.