Как использовать данные приложения в (App.config) connectionString - PullRequest
5 голосов
/ 22 ноября 2010

У меня есть база данных 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)?

Примечание: похоже, я ищу решение как можно скорее изменить строку подключения (в коде), а не собственное приложение.Конфигурация решения.

1 Ответ

12 голосов
/ 22 ноября 2010

Используйте поддержку настраиваемой переменной среды сборки:

Пусть у вас есть:

<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);
...