2008-09-19 3 views
5

쿼리를 보내기 전에 SqlConnection을 열어야하는 경우 동일한 방식으로 모든 비 Open ConnectionState를 처리 할 수 ​​있습니까? 예를 들어 :SqlConnection을 열기 전에 다른 ConnectionStates 처리

if (connection.State != ConnectionState.Open) 
    { 
     connection.Open(); 
    } 

나는 ConnectionState.Broken에 대한 연결이 재 오픈하기 전에 폐쇄 될 필요가 어딘가에 읽었다. 누구도이 경험이 있습니까? 감사합니다.

답변

5

http://msdn.microsoft.com/en-us/library/system.data.connectionstate.aspx

깨진 연결 상태는 계속 사용 자격 전에 닫고 다시 열 필요가 없습니다.

편집 : 불행히도 닫힌 연결을 닫는 것도 마찬가지입니다. 알 수없는 연결에 대해 조치를 취하기 전에 ConnectionState를 테스트해야합니다. 아마도 짧은 switch 문이 트릭을 수행 할 수 있습니다.

4

이 질문에 직접 대답하는 것은 아니지만 최선의 방법은 데이터베이스에 액세스 할 때마다 연결을 열고 닫는 것입니다. ADO.NET 연결 풀링은 이것이 잘 수행되도록합니다. 서버 응용 프로그램 (예 : ASP.NET)에서이 작업을 수행하는 것이 특히 중요하지만 데이터베이스에 직접 액세스하는 WinForms 응용 프로그램에서도이 작업을 수행합니다.

예 : 연결을 열 때 연결 상태를 확인 할 필요가 없습니다 이런 식으로

using(SqlConnection connection = new SqlConnection(...)) 
{ 
    connection.Open(); 
    // ... do your stuff here 

} // Connection is disposed and closed here, even if an exception is thrown 

.

+0

당신은 닫고 연결을 처리하기 위해 GC 기다릴한다 : 모두가 businss 로직 계층에서 읽고 업데이트 내 앞에

나는이 코드를 가지고있다. 연결이 끝나면 명시 적으로 연결을 닫아야합니다. – ddc0660

+0

using 문을 사용하면 예외가 throw 된 경우에도 연결을 닫을 수 있습니다. 그것은 GC가 그것을 닫을 때까지 기다리지 않습니다. – Joe

+1

이 패턴을 사용하면 모든 데이터 액세스가 어떻게 표시되는지를 알 수 있습니다. 이런 식으로 연결이 끊어지지는 않을 것입니다. Joe, SqlConnection을 사용할 때 "using (SqlCommand command ...)"를 추가하고 쿼리 문자열에 상수를 사용하여 항상 같은 풀에서 오는 지 확인하십시오. –

3

동일한 방식으로 처리 할 수 ​​있습니다. IE9를 사용하는 동안 수많은 연결 상태가 끊어졌습니다. 이 점에있어 근본적으로 IE9에는 잘못된 점이 있습니다. 데이터베이스 테이블을 5 개 또는 6 개 업데이트 한 후 다른 브라우저에서 연결 상태가 끊어진 것이 아니기 때문입니다. 그래서 객체 컨텍스트를 사용합니다. 그래서 기본적으로 닫고 다시여십시오.

if (context.Connection.State == System.Data.ConnectionState.Broken) 
{ 
    context.Connection.Close(); 
    context.Connection.Open(); 
} 
관련 문제