Как ограничить время ожидания для SqlConnection.Open ()?

StackOverflow https://stackoverflow.com/questions/1811409

  •  06-07-2019
  •  | 
  •  

Вопрос

Я хочу проверить правильность строки подключения, поэтому я создал новый SqlConnection, который называется его методом Open (). Но мне придется долго ждать, пока он вернется, когда часть server / data_source строки подключения неверна.

Я попытался добавить тайм-аут соединения в строку соединения, это не сработало; Я попытался открыть соединение в другом потоке, затем через несколько секунд я вызываю Thread.Abort (). Никто из них не работал.

Итак, как правильно это сделать? Спасибо.

Это было полезно?

Решение

после исследования я нашел решение ( 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.");
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top