You can use a singleton as I suggested in a reply to another question you asked about a database path. Originally done for SQL-Server (original source) but by changing the provider works on any data connection.
Usage
DataConnections.Instance.Connection()
Singleton for above
using System;
using System.Data;
using System.Data.Odbc;
namespace SingletonExample1.Classes
{
public sealed class DataConnections
{
private static readonly Lazy<DataConnections>
Lazy = new Lazy<DataConnections>(() => new DataConnections());
public static DataConnections Instance => Lazy.Value;
public OdbcConnection Connection()
{
OdbcConnection connection = null;
try
{
connection = connection = new OdbcConnection(RuntimeSettings.Instance.ConnectionString);
}
catch (Exception)
{
// ignored
}
if (connection == null || connection.State == ConnectionState.Broken || connection.State == ConnectionState.Closed)
{
try
{
connection?.Dispose();
}
catch (Exception)
{
// ignored
}
connection = new OdbcConnection();
}
if (connection.State != ConnectionState.Closed) return connection;
connection.ConnectionString = RuntimeSettings.Instance.ConnectionString;
connection.Open();
return connection;
}
}
}
Class to read app.config
using System.Configuration;
using System.IO;
using System.Reflection;
namespace SingletonExample1.Classes
{
public class ApplicationSettings
{
public static string GetDatabasePath() => GetSettingAsString("DatabasePath");
public static void SetDatabasePath(string value) => SetValue("DatabasePath", value);
public static string DatabaseConnectionString() => GetSettingAsString("ConnectionString");
public static string GetSettingAsString(string configKey) => ConfigurationManager.AppSettings[configKey];
public static void SetValue(string key, string value)
{
var applicationDirectoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var configFile = Path.Combine(applicationDirectoryName,
$"{Assembly.GetExecutingAssembly().GetName().Name}.exe.config");
var configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };
var config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap,
ConfigurationUserLevel.None);
config.AppSettings.Settings[key].Value = value;
config.Save();
Reload();
}
public static void Reload()
{
ConfigurationManager.RefreshSection("appSettings");
}
}
}
Class to get setting including a live data connection
using System;
namespace SingletonExample1.Classes
{
public sealed class RuntimeSettings
{
private static readonly Lazy<RuntimeSettings> Lazy =
new Lazy<RuntimeSettings>(() => new RuntimeSettings());
public static RuntimeSettings Instance => Lazy.Value;
public string DatabasePath
{
get => ApplicationSettings.GetDatabasePath();
set
{
ApplicationSettings.SetDatabasePath(value);
OnDatabasePathChangedEvent?.Invoke();
}
}
public string ConnectionString => ApplicationSettings.DatabaseConnectionString();
public delegate void OnDataPathChanged();
public static event OnDataPathChanged OnDatabasePathChangedEvent;
}
}
configuration file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<appSettings>
<add key="DatabasePath" value="C:\Users\QR\Documents\UserDatabase.accdb" />
<add key="ConnectionString" value="TODO" />
</appSettings>
</configuration>