2009-11-28 3 views
1

연결 문자열이 올바른지 테스트하기 위해 Open() 메서드라고하는 새 SqlConnection을 만들었습니다. 하지만 연결 문자열의 server/data_source 부분이 잘못되었을 때 반환되기까지 오래 기다려야합니다.SqlConnection.Open()의 대기 시간을 제한하는 방법은 무엇입니까?

연결 문자열에 연결 시간 제한을 추가하려고 시도했지만 작동하지 않았습니다. 다른 스레드에서 연결을 열려고 시도한 다음 몇 초 후에 Thread.Abort()를 호출합니다. 그들 중 누구도 일하지 않았습니다.

그럼 어떻게해야할까요? 감사합니다. .

답변

1

연구를 마친 후 솔루션 (http://www.improve.dk/blog/2008/03/10/controlling-sqlconnection-timeouts)을 찾았습니다. 조금 수정했습니다. throw 된 예외가 없으면 연결 문자열이 유효합니다.

 var alive = true; 
     string error = null; 
     var success = false; 

     // ReSharper disable AccessToModifiedClosure 
     // ReSharper disable UseObjectOrCollectionInitializer 
     var thread = new Thread(() => 
            { 
             try 
             { 
              var connection = new SqlConnection(connectionString); 
              connection.Open(); 
              connection.Close(); 

              if (alive) 
               success = true; 
             } 
             catch (SqlException ex) 
             { 
              if (alive) 
               error = ex.Message; 
             } 
             catch (ThreadAbortException) 
             { 
             } 
             finally 
             { 
              if (connection.State == ConnectionState.Open) 
               connection.Close(); 
             } 
            }); 
     // ReSharper restore AccessToModifiedClosure 
     // ReSharper restore UseObjectOrCollectionInitializer 
     thread.IsBackground = true; 
     var sw = Stopwatch.StartNew(); 
     thread.Start(); 

     var timeout = TimeSpan.FromSeconds(3); 
     while (sw.Elapsed < timeout) 
      thread.Join(TimeSpan.FromMilliseconds(200)); 
     sw.Stop(); 

     if (!success) 
     { 
      alive = false; 
      throw new Exception(error ?? "Connection timeout, please check the connection string."); 
     } 
관련 문제