Pregunta

Quiero probar si la cadena de conexión es correcta, así que creé una nueva SqlConnection, llamada su método Open (). Pero tengo que esperar mucho tiempo antes de que vuelva cuando la parte del servidor / data_source de la cadena de conexión es incorrecta.

Intenté agregar el tiempo de espera de conexión a la cadena de conexión, no funcionó; Intenté abrir la conexión en otro hilo, luego llamé a Thread.Abort () después de varios segundos. Ninguno de ellos funcionó.

Entonces, ¿cuál es la forma correcta de hacer esto? Gracias.

¿Fue útil?

Solución

después de investigar, encontré la solución ( http: / /www.improve.dk/blog/2008/03/10/controlling-sqlconnection-timeouts ), lo modifiqué un poco. Si no se produce una excepción, la cadena de conexión es válida.

        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.");
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top