C# 读写app.config遇到的问题

原文链接:C# 读写app.config遇到的问题 – 每天进步一点点

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

 

posted on 2025-04-10 14:47  longkui  阅读(70)  评论(0)    收藏  举报

导航