5

我在一个项目中有一个 SQL Server CE 数据库,我不想将其存储在 %AppData% 目录中的某个位置。但是我找不到在连接字符串中引用应用程序数据路径的方法(在 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=&quot;Data Source=|ApplicationData|\Entities.sdf&quot;" providerName="System.Data.EntityClient"/>
  </connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>

到目前为止,我了解到:不支持 %APPDATA% 并且使用设置类(如建议的那样)也不起作用(设置类在已引发异常时未构造)。

是否可以在 connectionString 属性(在 App.Config 中)中使用应用程序数据文件夹(或其他特殊文件夹)?

注意:似乎我正在寻找一种解决方案来尽早修改连接字符串(在代码中),而不是本机 App.Config 解决方案。

4

1 回答 1

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);
于 2010-11-22T08:57:15.923 回答