관련 sqlConnection이 배치 될 경우 sqlcommand.dispose ()가 필요합니까?
-
05-07-2019 - |
문제
나는 보통 다음과 같은 코드를 사용합니다.
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
{
var command = connection.CreateCommand();
command.CommandText = "...";
connection.Open();
command.ExecuteNonQuery();
}
내 command
자동으로 폐기 하시겠습니까? 또는 그렇지 않고 나는 그것을 포장해야합니다 using
차단하다? 폐기해야합니다 SqlCommand
?
해결책
그냥 이것을하십시오 :
using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
using(var command = connection.CreateCommand())
{
command.CommandText = "...";
connection.Open();
command.ExecuteNonQuery();
}
명령에 처분을 부르지 않으면 너무 나쁘지 않습니다. 그러나 처분을 부르는 것은 그럴 것입니다 파이널 라이저에 대한 호출을 억압하십시오, 호출은 성능 향상을 처리합니다.
다른 팁
가장 안전한 정책은 항상 전화하는 것입니다 Dispose()
객체가 구현되는 경우 IDisposable
, 명시 적으로 또는 사용 블록을 통해. 필요하지 않은 경우가있을 수 있지만 어쨌든 전화를 걸면 문제가 발생하지 않아야합니다 (수업이 올바르게 작성된 경우). 또한, 구현이 언제 변경 될 수 있는지 알지 못합니다. 즉, 호출이 이전에 필요하지 않은 경우, 이제는 확실히 필요합니다.
주어진 예에서는 명령에 블록을 사용하여 추가 내부를 추가하고 연결을 위해 블록을 사용하여 외부를 유지할 수 있습니다.
예, 구현이 현재 많은 일을하지 않더라도 미래에 어떻게 변경 될지 모르겠습니다 (예 : 새로운 프레임 워크 버전). 일반적으로 구현하는 모든 개체를 처리해야합니다. IDisposable
안전한쪽에 있습니다.
그러나 작업이 연기되고 전체 범위를 제어하지 않는 경우 (예 : 비동기 적으로 작동 할 때 또는 SqlDataReader
또는 그렇게), 당신은 다음을 설정할 수 있습니다 CommandBehavior
에게 CloseConnection
독자가 완료 되 자마자 연결이 제대로 닫히거나 배치됩니다.
당신은 이런 종류의 물건을 사용하여 찾을 수 있습니다 반사기 또는 dotpeek 또는 https://referencesource.microsoft.com/.
나는 작은 발굴을 가졌다 (나는 당신이 열심히 시도하지 않았기 때문에 나머지 부분을 완전히 확신 할 것을 제안 할 것입니다). 연결을 죽일 때 보이는 것처럼 보입니다. 그 연결과 함께. 또한 실제로 명령의 처분이 실제로 그렇게 많은 일을하는 것처럼 보이지 않습니다. 필드를 NULL로 설정하고 컨테이너에서 분리하고 (관리되는 메모리 누출을 방지 할 수 있음) 이벤트를 제기합니다 (이것은 중요 할 수도 있지만 누가이 이벤트를 듣고 있는지 알 수 없습니다).
어느 쪽이든,이 물건을 사용하는 블록에서 사용하거나 연결을 보유하는 객체에 폐기 패턴을 사용하여 폐기하는 것이 좋습니다 (명령을 잠시 동안 유지하려는 경우).
실제로, 당신은 건너 뛸 수 있습니다 Dispose
. 자원이 없습니다. 이후로 마무리를 억제하지 않습니다 SQLCOMMAND 생성자가 그렇게합니다.
이론적으로 Microsoft는 관리되지 않는 리소스를 보유하기 위해 구현을 변경할 수 있지만 Component
그들이하기 오래 전에 기본 클래스.
내 생각에, 전화 Dispose
모두 SqlConnection
그리고 SqlCommand
모범 사례입니다. 아래 코드를 사용하십시오
using(var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString))
try{
using(var command = connection.CreateCommand())
{
command.CommandText = "...";
connection.Open();
command.ExecuteNonQuery();
}
}
catch(Exception ex){ //Log exception according to your own way
throw;
}
finally{
command.Dispose();
connection.Close();
connection.Dispose();
}