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 就能发现它的内容已经被修改了。

分类: .Net/C#