Question

Je veux vérifier si la chaîne de connexion est correcte. J'ai donc créé un nouveau SqlConnection, appelé méthode Open (). Mais je dois attendre longtemps avant qu’il ne revienne lorsque la partie server / data_source de la chaîne de connexion est incorrecte.

J'ai essayé d'ajouter un délai de connexion à la chaîne de connexion, cela ne fonctionnait pas. J'ai essayé d'ouvrir la connexion dans un autre thread, puis j'appelle Thread.Abort () après plusieurs secondes. Aucun d'entre eux n'a fonctionné.

Alors, quelle est la bonne façon de faire cela? Merci.

Était-ce utile?

La solution

après des recherches, j'ai trouvé la solution ( http: / /www.improve.dk/blog/2008/03/10/controlling-sqlconnection- timeouts ), je l’ai un peu modifié. S'il n'y a pas d'exception levée, la chaîne de connexion est valide.

        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.");
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top