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,然后将数据库文件放入该文件夹即可。