1、业务背景
维护老系统代码,Web.config中数据库字符串连接的相对路径的处理
2、核心代码如下
<connectionStrings>
<add name="connString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\FnDB.mdb" providerName="System.Data.OleDb"/>
</connectionStrings>
|DataDirectory|会被自动解析到App_Data
编辑
官方文档地址:对 |DataDirectory| 替代字符串和 Web 应用程序根目录运算符 (~) 的支持
3、注意事项
1)|DataDirectory| 仅能应指定在路径的开头,放在任何其他位置将得不到解析。 如 |DataDirectory|\FnDB.mdf被解析为 项目根目录\App_Data\FnDB.mdf,而\data|DataDirectory| \FnDB.mdf 则视为物理路径,不会对|DataDirectory|做解析)
2)|DataDirectory| 在WebForm项目下默认为 项目根目录\App_Data文件夹,在Winform和控制台项目下,则为 项目根目录\bin\debug 或 项目根目录\bin\release 文件夹
对于Winform和控制台项目,一般使用AppDomain.CurrentDomain辅助类,即可以通过AppDomain.CurrentDomain.setData("DataDirectory","个人目录字符串") 来自定义|DataDirectory|的对应路径,接着去除掉debug模式和release模式的路径不同之处。此处需要注意的是,发布程序的时候,数据库也要放到App_Data目录下面,示例代码如下:
static void Main(string[] args)
{
string catalogue = AppDomain.CurrentDomain.BaseDirectory;
if (catalogue.IndexOf("\bin\") > 0) {
if (catalogue.EndsWith("\bin\Debug\"))
catalogue = catalogue.Replace("\bin\Debug", "");
if (catalogue.EndsWith("\bin\Release\"))
catalogue = catalogue.Replace("\bin\Release", "");
}
if (!catalogue.EndsWith("App_Data\"))
catalogue = catalogue + "App_Data\";
AppDomain.CurrentDomain.SetData("DataDirectory", catalogue);
}
亦或者如下代码:
static void Main(string[] args) {
string catalogue = AppDomain.CurrentDomain.BaseDirectory;
if(catalogue.EndsWith(@"\bin\Debug") || catalogue.EndsWith(@"\bin\Release"))
{
catalogue = System.IO.Directory.GetParent(catalogue).Parent.Parent.FullName + "\App_Data";
AppDomain.CurrentDomain.SetData("DataDirectory", catalogue);
}
}
数据库连接配置文件与本项目Web.config配置完全相同,注意在WinForm中并不存在App_Data文件夹这个特殊文件夹,我们只需新建文件夹改名为App_Data,然后将数据库文件放入该文件夹即可。
若本文有帮助到阅读本文的同学,欢迎点赞、关注、收藏,互相学习交流。