C# WinForm如何读取文本路径动态配置app.config数据库连接串
问题背景
在Visual Studio环境下使用C#开发基于Windows Form的数据库应用程序,需求如下:
- 程序首次运行时,由用户自主选择数据库文件所在文件夹
- 所选文件夹路径存储在文本文件中
- app.config配置文件可读取该文本文件内容,获取数据库实际存储位置
初始app.config配置代码如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name="MyProgram.Properties.Settings.DataBaseTestingConnectionString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\MyProgram\DataBaseTesting.accdb" providerName="System.Data.OleDb" /> <add name="cn" connectionString="data source=.;initial catalog=NORTHWIND;user id=sa" providerName="System.Data.OleDb" /> </connectionStrings> </configuration>
需要实现:将连接字符串中Data Source属性对应的固定硬编码路径E:\MyProgram\DataBaseTesting.accdb,替换为读取桌面location.txt文件第一行存储的动态数据库路径。
验证可用的实现方案(2022年6月17日更新)
无需运行时动态修改app.config文件,通过ADO.NET内置的|DataDirectory|路径占位符即可实现,步骤如下:
- 修改App.config中的连接字符串配置
将原有写死的Data Source固定路径,替换为|DataDirectory|占位符,修改后对应连接字符串配置为:
<add name="MyProgram.Properties.Settings.DataBaseTestingConnectionString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DataBaseTesting.accdb" providerName="System.Data.OleDb" />
其余配置项保持不变即可。
- 在C#业务代码中动态赋值DataDirectory路径
在程序启动逻辑中,先完成路径读取/选择逻辑:
- 若桌面存在
location.txt文件,直接读取文件第一行内容作为数据库文件夹路径,赋值给全局变量Global.path - 若为首次运行无该文件,弹出文件夹选择对话框让用户指定数据库所在目录,将选中的路径写入桌面
location.txt持久化存储,同时赋值给Global.path
在第一次实例化数据库连接对象之前,执行如下配置语句:
AppDomain.CurrentDomain.SetData("DataDirectory", Global.path);
注意:该语句的执行顺序必须早于任何数据库连接创建操作,否则
|DataDirectory|占位符会默认解析为程序运行目录,导致路径匹配失败。
该方案不需要修改配置文件的写入权限,也不需要手动拼接完整连接字符串,运行时ADO.NET会自动将连接字符串中的|DataDirectory|替换为设置的自定义路径,稳定性更高。
内容的提问来源于stack exchange,提问作者Nelson Furtado
相关产品推荐
相关产品推荐

