Pergunta

Eu tenho um banco de dados SQL Server CE em um projeto que não quero armazenar em algum lugar no diretório% AppData%.No entanto, não consigo encontrar uma maneira de fazer uma referência ao caminho dos dados do aplicativo na cadeia de conexão (no 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>

Até agora aprendi que:%APPDATA% não é suportado e o uso da classe de configurações (como sugerido) também não funcionará (a classe de configurações não é construída no momento em que a exceção já foi lançada).

É possível utilizar a pasta de dados da aplicação (ou outra pasta especial) na propriedade connectionString (no App.Config)?

Observação:parece que estou procurando uma solução para modificar a string de conexão (no código) o mais cedo possível, em vez de uma solução App.Config nativa.

Foi útil?

Solução

Use o suporte à variável de ambiente de compilação personalizada:

Deixe você ter:

<connectionStrings>
    <add name="My" connectionString="..;Data Source=|%AppData%|\Entities.sdf;.." />
</connectionStrings>

Você pode usar:

using System.Configuration; // requires reference to System.Configuration.dll

ConfigurationManager.ConnectionStrings["EntityConnectionString"].ConnectionString.Replace("%AppData%", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

Da próxima maneira, você pode oferecer suporte a diversas variáveis ​​de ambiente:

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top