¿Cómo limitar el tiempo de espera para SqlConnection.Open ()?
-
06-07-2019 - |
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.
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.");
}