呼び出しのたびに接続をチェックしないように、実装したソリューション全体を共有したいと思います。接続文字列が間違っている場合、例外が実行を停止します。そうでない場合、接続文字列を開こうとする試みは、接続文字列ごとに1回だけ行われます。
lock
接続はマルチスレッドであることが多いため、チェックで使用されるsyncobjを追加しました
#if DEBUG
private static object syncobj = new object();
private static ConcurrentDictionary<string, bool> CheckedConnection = new ConcurrentDictionary<string, bool>();
private static void CheckCanOpenConnection(SqlConnection connection)
{
lock (syncobj)
{
try
{
CheckedConnection.TryGetValue(connection.ConnectionString, out bool found);
if (found)
{
return;
}
else
{
connection.Open();
var canOpen = connection.State == ConnectionState.Open;
connection.Close();
CheckedConnection.TryAdd(connection.ConnectionString, true);
return;
}
}
catch
{
throw new ApplicationException("Unable to connect to: " + connection.ConnectionString);
}
}
}
#endif
これは、接続をインスタンス化するメソッドからの呼び出しです
private SqlConnection CreateConnection()
{
if (_connection == null)
{
_connection = new SqlConnection(this.ConnectionString);
#if DEBUG
CheckCanOpenConnection(_connection);
#endif
}
return _connection;
}