SqlConnection.Open()の待機時間を制限する方法は?
-
06-07-2019 - |
質問
接続文字列が正しいかどうかをテストしたいので、Open()メソッドと呼ばれる新しいSqlConnectionを作成しました。しかし、接続文字列のserver / data_source部分が間違っている場合、戻る前に長い時間待たなければなりません。
接続タイムアウトを接続文字列に追加しようとしましたが、機能しませんでした。 別のスレッドで接続を開こうとした後、数秒後にThread.Abort()を呼び出しました。 どれも機能しませんでした。
では、これを行う正しい方法は何ですか? ありがとう。
解決
調査後、解決策を見つけました( http:/ /www.improve.dk/blog/2008/03/10/controlling-sqlconnection-timeouts )、それを少し変更しました。例外がスローされない場合、接続文字列は有効です。
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.");
}
所属していません StackOverflow