Frage

Ich möchte testen, ob die Verbindungszeichenfolge korrekt ist, so habe ich ein neues SqlConnection, rief seine Open () Methode. Aber ich muss lange warten, bevor er zurückkehrt, wenn der Server / data_source Teil der Verbindungszeichenfolge falsch ist.

Ich habe versucht, Verbindung Timeout die Verbindungszeichenfolge hinzufügen, es hat nicht funktioniert; Ich habe versucht, die Verbindung in einem anderen Thread geöffnet, dann rufe Thread.Abort I (), nach einigen Sekunden. Keiner von ihnen arbeitete.

Also, was ist der richtige Weg, dies zu tun? Danke.

War es hilfreich?

Lösung

Nach der Untersuchung habe ich die Lösung gefunden ( http: / /www.improve.dk/blog/2008/03/10/controlling-sqlconnection-timeouts ), I modifiziert es ein wenig. Wenn es nicht Ausnahme ausgelöst ist, dann ist die Verbindungszeichenfolge gültig ist.

        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.");
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top