如何将应用设置项(数据库连接字符串)持久化至exe.config文件?
解决连接字符串重启后恢复默认值的问题
你遇到的核心问题是对.NET设置机制的范围配置理解偏差,下面给你分两种场景提供解决方案:
一、最推荐的方案:调整设置范围为User
默认情况下如果你的MMABooksConnectionString是Application范围的设置,这个值属于只读属性,My.Settings.Save()只会在当前进程内存中生效,不会修改程序目录下的CustomerMaintenanceDB.exe.config,重启后自然会恢复默认值。
解决步骤:
- 右键你的项目 → 选择「属性」→ 切换到「设置」标签页
- 找到
MMABooksConnectionString项,把「范围」从Application修改为User - 保存设置后,你原来的代码就能正常工作:
If ValidateStringConnection() Then My.Settings.MMABooksConnectionString = stNewStringConnection My.Settings.Save() txtCurrentConnection.Text = My.Settings.MMABooksConnectionString End If
修改范围后,Save()会把连接字符串保存到用户专属配置文件(路径通常是C:\Users\[用户名]\AppData\Local\[项目相关目录]\user.config),重启应用时会优先读取这个用户自定义的值,而非项目默认的exe.config内容。
二、不推荐方案:直接修改程序目录下的exe.config
如果你一定要修改程序目录里的CustomerMaintenanceDB.exe.config(不建议,因为普通用户可能没有该目录的写入权限,比如Program Files下的程序),可以通过ConfigurationManager手动操作配置文件:
Imports System.Configuration ' 直接打开程序根目录的配置文件 Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) ' 获取连接字符串节点 Dim connStringsSection As ConnectionStringsSection = config.ConnectionStrings ' 修改目标连接字符串 If connStringsSection.ConnectionStrings("MMABooksConnectionString") IsNot Nothing Then connStringsSection.ConnectionStrings("MMABooksConnectionString").ConnectionString = stNewStringConnection ' 保存修改 config.Save(ConfigurationSaveMode.Modified) ' 刷新配置让当前应用立即生效 ConfigurationManager.RefreshSection("connectionStrings") txtCurrentConnection.Text = stNewStringConnection End If
⚠️ 注意:这种方式需要应用拥有程序目录的写入权限,部署时可能需要调整文件夹权限,或者要求用户以管理员身份运行应用,否则会抛出权限异常。
补充说明:为什么原代码无效?
- Application范围的设置是编译时确定的,存储在exe.config中,属于只读属性,
My.Settings.Save()不会修改这个文件 - User范围的设置是针对每个用户的个性化配置,会保存到用户的AppData目录,重启应用时会自动加载这个自定义值
内容的提问来源于stack exchange,提问作者Antony
相关产品推荐
相关产品推荐

