0.背景
打算修改app.config中的数据库连接字符串,初始状态如下:
界面初始化的时候加载这些数据,然后通过代码去修改这些数据,在修改的过程中发现一直不生效。
1.原因1:
发现自己抄错代码,自己百度了一段代码,就开始抄,比如下面这段:
/// <summary> /// 读取所有配置信息 /// </summary> public Dictionary<string,string> ReadAllSettings() { Dictionary<string, string> configDic = new Dictionary<string, string>(); try { var appSettings = ConfigurationManager.AppSettings; if (appSettings.Count == 0) { Console.WriteLine("AppSettings is empty."); return configDic; } else { foreach (var key in appSettings.AllKeys) { Console.WriteLine("Key: {0} Value: {1}", key, appSettings[key]); configDic.Add(key, appSettings[key]); } return configDic; } } catch (ConfigurationErrorsException) { Console.WriteLine("Error reading app settings"); return null; } } /// <summary> /// 读取一个配置项 /// </summary> /// <param name="key"></param> /// <returns></returns> public string ReadSetting(string key) { try { var appSettings = ConfigurationManager.AppSettings; string result = appSettings[key] ?? "Not Found"; Console.WriteLine(result); return result; } catch (ConfigurationErrorsException) { Console.WriteLine("Error reading app settings"); return null; } } /// <summary> /// 更新或者新建一个配置项 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public bool AddUpdateAppSettings(string key, string value) { try { var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var settings = configFile.AppSettings.Settings; if (settings[key] == null) { settings.Add(key, value); } else { settings[key].Value = value; } configFile.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); return true; } catch (ConfigurationErrorsException) { Console.WriteLine("Error writing app settings"); return false; } }
这段代码还是微软官方推荐的,抄上以后发现一直不对,后来才发现人家这是修改appsetting的,比如这样:
<appSettings> <add key="NAME" value="name" /> <add key="AGE" value=10 /> ..... </appSettings>
我上面的写的是connectionStrings,肯定不对啊。
2.原因2
我修改了我的代码,添加了这么一段代码来修改数据库连接是配置信息
// 打开配置文件 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // 修改连接字符串 config.ConnectionStrings.ConnectionStrings["connString"].ConnectionString = value; // 保存修改 config.Save(ConfigurationSaveMode.Modified); // 更新配置 ConfigurationManager.RefreshSection("connectionStrings");
但是操作以后发现还是不生效,问题又来了。。。
后来终于发现了问题:代码中写入配置文件并进行Debug时,你源码中的App.config并没有被修改。原因是
bin/Debug/YourProjectName.exe.config的内容是从你源码中获得的,你程序一运行,就会从源码获取数据,然后覆盖bin/Debug/YourProjectName.exe.config 的内容,所以,Debug模式下是无法看到被修改的。
那么怎么测试呢?很简单,我们直接运行bin/Debug/YourProjectName.exe不Debug
然后操作完毕以后再查看bin/Debug/YourProjectName.exe.config 就能发现它的内容已经被修改了。