我正在开发一个具有实时网络数据库和意外本地数据库的应用程序,它会检测实时网络数据库是否可访问,如果没有,则会在三秒后超时,更改连接字符串到当地的应急数据库。
根据SO提示,我设法在运行时期间更改app.config上的连接字符串,并重新加载设置。
这是应用程序在需要更改连接字符串时调用的方法:
public static void ChangeConnectionString(string connectionstring)
{
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
connectionStringsSection.ConnectionStrings[0].ConnectionString = connectionstring;
var connectionStrings = config.ConnectionStrings;
foreach (ConnectionStringSettings connectionString in connectionStrings.ConnectionStrings)
{
connectionString.ConnectionString = connectionstring;
}
config.Save();
ConfigurationManager.RefreshSection("connectionStrings");
PDV_WPF.Properties.Settings.Default.Save();
PDV_WPF.Properties.Settings.Default.Reload();
//Ensures the configuration is saved and reloaded.
FbConnection.ClearAllPools();
//Closes all currently open connections which might be using the old connection string.
Debug.WriteLine("==========Ran ChangeConnectionString");
Debug.WriteLine("==========FDBConnString is:");
Debug.WriteLine("==========" + PDV_WPF.Properties.Settings.Default.FDBConnString);
从网络断开计算机后,无论何时检查当前的FDBConnString,它都会正确指向本地应急数据库。但是,在下一行,当它尝试运行查询时,我得到以下异常:
Inner Exception 1:
IscException: Unable to complete network request to host "dbserver".
Inner Exception 2:
SocketException: Este host não é conhecido //(This host is unknown)
完整的例外情况:https://pastebin.com/3syLvsQf
似乎即使在我成功更改连接字符串并成功重新加载应用程序配置文件之后,它仍然尝试使用旧连接字符串打开连接。即使我调用Debug在FbConnection.Open()调用上方的行上打印当前的Properties.Settings.Default.FDBConnString,它也会显示 new string 而不是不正确的旧字符串。
有关可能发生的事情的任何见解?
答案 0 :(得分:0)
我发现了什么问题。 我正在从生成的xsd文件中实例化一个继承的表适配器。当我在我的类上声明一个表适配器时,它还会在声明时继承存储在app.config上的连接字符串。因此,如果我更改app.config并不重要,因为声明的表适配器已经停留在先前的连接字符串中。
所以,解决方案是,而不是更改存储在app.config上的连接字符串,我只需要更改声明的表适配器上的连接字符串:
tB_STOCKTableAdapter1.Connection.ConnectionString = Properties.Settings.Default.ContingencyDB;
tB_STK_PRODUCTTableAdapter1.Connection.ConnectionString = Properties.Settings.Default.ContingencyDB;
或
tB_STOCKTableAdapter1.Connection.ConnectionString = Properties.Settings.Default.NetworkDB;
tB_STK_PRODUCTTableAdapter1.Connection.ConnectionString = Properties.Settings.Default.NetworkDB;
ContingencyDB和NetworkDB都是存储在app.config上的字符串,作为用户范围的字符串,可以通过提供给用户的给定“设置”窗口进行更改。