【问题标题】:How to limit the wait time for SqlConnection.Open()?如何限制 SqlConnection.Open() 的等待时间?
【发布时间】:2009-11-28 03:01:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: timeout database-connection


    【解决方案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.");
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-25
      • 2022-11-20
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多