C# Winform如何编程修改app.config中SQLite连接字符串并持久化?
解决方案
一、持久化修改connectionStrings配置
首先确保项目已添加System.Configuration程序集引用,仅导入命名空间无法调用完整的配置修改能力。
正确的持久化修改代码如下:
// 1. 打开当前应用的配置文件 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // 2. 获取connectionStrings配置节点 ConnectionStringsSection connSection = config.ConnectionStrings; // 3. 修改两个连接字符串配置 string newConnStrDefault = $"Data Source = {newDbPath};Version=3;foreign keys=true"; string newConnStrOff = $"Data Source = {newDbPath};Version=3"; connSection.ConnectionStrings["Default"].ConnectionString = newConnStrDefault; connSection.ConnectionStrings["ConstraintsOff"].ConnectionString = newConnStrOff; // 4. 保存修改 config.Save(ConfigurationSaveMode.Modified); // 5. 刷新配置缓存,保证运行时后续读取的是最新值 ConfigurationManager.RefreshSection("connectionStrings");
注意:调试阶段VS会生成后缀为vshost.exe.config的临时配置文件,修改会写入这个文件而非项目根目录的app.config,正式发布后修改会直接写入应用同名的.exe.config文件,符合预期。
二、存储上次备份日期实现自动备份逻辑
第一步:修改app.config添加appSettings节点
在configuration节点下新增appSettings子节点:
<configuration> <!-- 原有connectionStrings、startup节点保留 --> <appSettings> <add key="LastBackupDate" value="2024-01-01" /> </appSettings> </configuration>
第二步:读取上次备份日期判断是否需要备份
DateTime lastBackupDate; // 读取配置,若不存在则默认取30天前的日期,触发首次备份 if (!DateTime.TryParse(ConfigurationManager.AppSettings["LastBackupDate"], out lastBackupDate)) { lastBackupDate = DateTime.Now.AddDays(-30); } // 判断是否需要备份 if ((DateTime.Now - lastBackupDate).TotalDays >= 30) { // 执行你已实现的备份逻辑 // ... // 备份完成后更新配置中的日期 UpdateLastBackupDate(DateTime.Now); }
第三步:更新日期到配置文件持久化
public void UpdateLastBackupDate(DateTime backupDate) { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); AppSettingsSection appSettings = config.AppSettings; appSettings.Settings["LastBackupDate"].Value = backupDate.ToString("yyyy-MM-dd"); config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); }
注意事项
如果你的程序安装在系统盘的Program Files目录下,普通用户默认没有写入权限,会导致保存配置失败。这种情况建议将配置文件迁移到用户目录的AppData\Roaming路径下存储,或者给程序添加管理员运行权限。
内容的提问来源于stack exchange,提问作者Dasph
相关产品推荐
相关产品推荐

