Wie die Wartezeit für SqlConnection.Open () zu begrenzen?
-
06-07-2019 - |
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.
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.");
}