我在一个项目中有一个SQL Server CE数据库,我不想将它存储在%AppData%目录中。但是我找不到在连接字符串中引用Application Data路径的方法(在App.Config中)
<?xml version="1.0"?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="EntityConnectionString" connectionString="metadata=res://*/EntityModel.csdl|res://*/EntityModel.ssdl|res://*/EntityModel.msl;provider=System.Data.SqlServerCe.3.5;provider connection string="Data Source=|ApplicationData|\Entities.sdf"" providerName="System.Data.EntityClient"/>
</connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>
到目前为止,我了解到:%APPDATA%不受支持,并且使用设置类(如建议的)也不起作用(在抛出异常时不构造设置类)。
是否可以在connectionString属性中使用应用程序数据文件夹(或其他特殊文件夹)(在App.Config中)?
注意:我似乎正在寻找一种解决方案来尽早修改连接字符串(在代码中),而不是原生的App.Config解决方案。
答案 0 :(得分:12)
使用您的自定义构建环境变量支持:
让你拥有:
<connectionStrings>
<add name="My" connectionString="..;Data Source=|%AppData%|\Entities.sdf;.." />
</connectionStrings>
你可以使用:
using System.Configuration; // requires reference to System.Configuration.dll
ConfigurationManager.ConnectionStrings["EntityConnectionString"].ConnectionString.Replace("%AppData%", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
接下来,您可以支持多个环境变量:
var vars = new Dictionary<string, string>
{
{ "%AppData%", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
{ "%Temp%", Environment.GetFolderPath(SpecialFolder.Temp) },
// etc..
{ "%YourNonStandardVar", "YourNonStandartPath" }
};
var result = ConfigurationManager.ConnectionStrings["YourString"].ConnectionString
foreach (var v in vars)
result = result.Replace(v.Key, v.Value);