2009-10-19 7 views
4

이 메서드를 완료하면 SqlConnection이 잠겨 있습니까? 아니면 마지막에 close 메소드를 명시 적으로 호출해야합니까?Sql 연결 삭제

using (SqlCommand cmd = new SqlCommand(sql, GetConnection())) 
    { 
     SqlDataReader reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
     } 
    } 

SqlConnection GetConnetion() 
{ 
return new SqlConnection("connectionstring"); 
} 

나는 이런 식으로 뭔가를 할 수 알고 :

SqlConnection conn = GetConnetion(); 
SqlCommand cmd =new SqlCommand(sql, conn); 
//Do Something 
conn.Close() 
cmd.Dispose() 

그러나 사용하여 블록이이 경우에 작동하는 방법 그냥 궁금해서. 환호

답변

17

아니요, 연결 개체가 예제에서 자동으로 삭제되지 않습니다. using 블록은 연결이 아닌 SqlCommand 개체에만 적용됩니다.

는 연결이 배치되어 있는지 확인 SqlConnection 객체가 자신의 using 블록에 싸여 있는지 확인하십시오 :

using (SqlConnection conn = GetConnection()) 
using (SqlCommand cmd = new SqlCommand(sql, conn)) 
{ 
    // don't forget to actually open the connection before using it 
    conn.Open(); 
    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      // do something 
     } 
    } 
} 
+0

Yeap- 다른 대답이 잘못되었습니다. – RichardOD

+1

+1 - 정답, 또한 중첩 된 문 대신에 => 더 깨끗한 코드를 중첩하는 것의 좋은 사용법에 유의하십시오. –

1

using 문을 사용하면이 문제가 해결됩니다.

+0

+1 예, using 문이이를 수행합니다. –

+4

연결에 대한 사용 문이 없습니다. –

+0

Dipose 메서드가 SqlCommand에서 호출되거나 SqlConnection에서 Close 메서드를 호출하기 위해 using 문 * know *이 사용 되었기 때문에 이러한 현상이 발생합니까? –

0

아차. 당신은 당신의 명령이 아닌 당신의 연결에서 이것을 사용하고 싶습니다.

0

using을 사용하지만 연결에서는 SqlCommand가 아니라 사용하십시오. 연결의 Dispose 메서드는 연결을 닫습니다 (풀링을 사용하는 경우 풀로 반환). 또한 너무 SqlDataReader 개체 주위에 사용 장소 :

using(SqlConnection conn = GetConnection()) 
{ 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
    do 
    { 
     while (reader.Read()) 
     { 
     } 
    } while (reader.NextResult()); 
    } 
} 
+0

사실,'SqlConnection'과'SqlCommand'는 모두'IDisposable'을 구현합니다. 따라서 둘 다 처리해야합니다. –

+0

Fredrik : SqlCommand는 Component Dispose를 상속합니다. SqlCommand에는 자체 리소스가 없으므로 Dispose를 명시 적으로 호출하지 않는 유일한 효과는 GC가 첫 번째가 아니라 두 번째 단계에서 데이터를 수집한다는 것입니다 (http://bit.ly/2WqJeR). 나는 그들을 처분하는 것을 결코 (나쁜 습관) 괴롭히지 않는다. 당신 말이 맞습니다. 실제로 주위를 사용하여 랩하는 것은 좋은 습관입니다. 향후 릴리스에서 폐기 할 리소스가있을 수 있으며 사용하는 모든 IDisposable을 랩핑하는 좋은 습관 일뿐입니다. –

+1

나는'SqlCommand.Dispose'의 내부 동작을 알고있다. 나는 내 코드가 다른 유형의 내부 (및 개인) 구현 세부 정보에 의존하는 것을 좋아하지 않는다. –

0

HereHere 당신이 무슨 일이 일어나고 있는지 이해를 도울 수있는 무언가이다.

+0

링크를 주셔서 감사합니다 –

2

루크의 답변은 연결 처분과 관련하여 구체적으로 묻는 질문과 관련하여 정확한 답변입니다. 완성도에 대한

, 당신이 할도 수하는 CommandBehvaiour.CloseConnection에 전달하는 매개 변수가 하나 대신 SqlCommand.ExecuteReader(CommandBehaviour) 방법을 사용하는 것입니다

using (SqlCommand cmd = new SqlCommand(sql, GetConnection())) 
{ 
    using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
    { 
     while (reader.Read()) 
     {} 
    } 
} 

이것은 SqlDataReader가 (폐쇄 될 때이 배치 될 때 의미 of of the using 구문), 사용중인 연결을 닫습니다.

나는 묵시적인 논리가 있기 때문에이 접근법에 열중하지 않으며 정확하게 연결을 닫고있는 것이 명확하지 않습니다.

+0

@adrian : 나는 그것에 대해서도 열망하지는 않지만 내 대답에이 방법을 언급하려고했습니다. 게다가 연결 개체가 모든 상황에서 제대로 처리되도록해야합니다. 예를 들어 연결을 인스턴스화 한 후 * 판독기를 인스턴스화하기 전에 * 예외가 발생할 수 있습니다. – LukeH

+0

예. 개인적으로 접근 방식이 마음에 들지 않지만 언급 할만한 가치가 있다고 생각했습니다. – adrianbanks