2009-11-28 234 views
1

我想测试连接字符串是否正确,所以我创建了一个新的SqlConnection,称为Open()方法。但是,当连接字符串的server/data_source部分出错时,它必须等待很长时间才能返回。如何限制SqlConnection.Open()的等待时间?

我试着给连接字符串添加连接超时,它没有工作; 我试过在另一个线程中打开连接,然后几秒钟后调用Thread.Abort()。 他们都没有工作。

那么这样做的正确方法是什么? 谢谢。

回答

1

经过研究,我找到了解决方案(http://www.improve.dk/blog/2008/03/10/controlling-sqlconnection-timeouts),我修改了一下。如果没有抛出异常,那么连接字符串是有效的。

 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."); 
     }