2013-12-10 2 views
2

데이터베이스 연결을 사용하고 닫는 일반적인 방법은 무엇인지 물어보고 싶습니다.연결이 닫혀 있는지 확인

이것은 내 프로그램이지만 예외 인 connection.Close()가 실행되지 않습니다.

전체 블록에 try-catch를 사용해야합니까? 왜냐하면 어떤 이유로 나는 대부분의 사람들이 나던 것을 본다.

using (SqlConnection connection = new SqlConnection(ConnectionString)) 
     { 
      using (SqlCommand command = new SqlCommand()) 
      { 
       command.CommandText = "procedure"; 

       command.Connection = connection; 

       command.CommandType = CommandType.StoredProcedure; 

       tmpParameter = DBUtils.createInSQLParam("@ImageID", SqlDbType.SmallInt, htmlImageId); 
       command.Parameters.Add(tmpParameter); 

       command.Connection.Open(); 

       using (SqlDataReader reader = command.ExecuteReader()) 
       { 
        htmlImageDetails = GetHtmlImageDetailsFromReader(reader, true, out newId); 

        reader.Close(); 
       } 

       connection.Close(); 

       return htmlImageDetails; 
      } 
     } 
+0

예외는 무엇입니까? –

+0

이 질문에 대한 답변을 것 같습니다 - http://stackoverflow.com/a/4717802/978528. – nickfinity

+0

"사용"을 사용할 때 연결이 닫히지 않습니다/판독기가 자동으로 닫힙니다. .net은 기본적으로 연결 풀링을 사용하므로 연결을 재사용하기 위해 풀에 배치하면 연결이 닫히지 않습니다. 이렇게하면 대부분의 경우 성능이 향상됩니다. – Peter

답변

5

당신은 using 문법 설탕 덕분에 당신의 SqlConnection 인스턴스가 항상 배치됩니다 (다음, 연결이 폐쇄) 때문에, 명시 적으로 할 필요가 없습니다.

2

내가 전체 블록에 대한 시도 - 캐치를 사용해야합니까? 어떤 이유 때문에 나는 대부분의 사람들이 나던 것을 본다. 당신이 using 문을 사용하고 있기 때문에

번호, 즉 예외가이 개체의 처리를 보장합니다 발생하므로 경우에도 try-finally 블록으로 변환합니다.

using 문

using Statement (C# Reference)

는 객체의 메소드를 호출하는 동안 예외가가 발생했을 경우 폐기도 라고 보장합니다. 은 try 블록 안에 객체를 넣은 다음 finally 블록에서 Dispose를 호출하여 동일한 결과를 얻을 수 있습니다. 사실, 이것은 using 문이 컴파일러에 의해 어떻게 변환되는지입니다.

SqlConnection.Dispose은 연결이 닫혀 있는지 확인합니다.

는 연결이 항상 닫혀 있는지 확인 하십 using 블록의 내부 연결 을 열려면 ....... 이렇게하면 코드 블록을 종료 할 때 연결 가 자동으로 종료되도록합니다.

2

using 블록으로 연결을 열면 컴파일러에서 연결시 Dispose()이 호출되는지 확인합니다 (Close()). 걱정하지 않으려면 Exception의 경우에도 직접 연결을 Close() 필요가 없습니다.