如何限制SqlConnection.Open()的等待时间?

时间:2009-11-28 03:01:09

标签: timeout database-connection

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

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

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

1 个答案:

答案 0 :(得分: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.");
        }
相关问题