Mudar app.config em tempo de Execução

1,645 views
Skip to first unread message

cafedrigo

unread,
Apr 8, 2009, 8:47:40 PM4/8/09
to DotNetFloripa
Nunca trabalhei com o app.config, e agora surgiu a necessidade.
Como posso alterar esta string de conexão em tempo de execução do
programa.
Pois este é meu computador de homologação, quando passar pro cliente o
DataSource será diferente.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add
name="SisRetagarda.Properties.Settings.SisMonConnectionString"
connectionString="Data Source=Carlos\SQLEXPRESS2008;Initial
Catalog=SisMon;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>

OBS: Utilizo VS2008 com C# , Framework 3.5.
Este é um projeto Windows Forns.

Agradeço antecipadamente por qualquer ajuda.

Carlos Angelo Fedrigo Júnior

Calil

unread,
Apr 8, 2009, 9:07:13 PM4/8/09
to dotnet...@googlegroups.com
Fala Carlos,

Precisei fazer isso em um projeto há pouco tempo, mas também não consegui.
Encontrei este post que parecia resolver o problema, mas não funcionou comigo (noobness? maybe).

O que fiz foi criar uma classe que tivesse todos os atributos que eu precisaria ler no App.config, e trabalhei com serialização via XML.
O código fica curto e você ainda pode editar os parâmetros no arquivo XML, como poderia no App.config.

Em anexo a classe que utilizei, e aqui os trechos de código para ler e gravar:

. Leitura:
(...)
Configuracao mConfig = null;

try
{
    XmlSerializer mSerializador = new XmlSerializer(typeof(Configuracao));
    TextReader mLeitor = new StreamReader("configuracao.xml");
    mConfig = (Configuracao)mSerializador.Deserialize(mLeitor);
    mLeitor.Close();
}
catch (Exception mErro)
{
    this.AdministracaoDeErros("Erro ao ler o arquivo de configuracao.", mErro);
    return;
}
(...)

. Escrita:
(...)
Configuracao mConfig = new Configuracao();
try
{
    XmlSerializer mSerializador = new XmlSerializer(typeof(Configuracao));
    StreamWriter mStream = new StreamWriter("configuracao.xml");
    mSerializador.Serialize(mStream, mConfig);
}
catch (Exception mErro)
{ this.AdministracaoDeErros("Erro ao salvar a senha criptografada no arquivo de configuração.", mErro); }
(...)

Lembrando que as classes necessárias estão no namespace System.Xml.Serialization e System.IO.

[]s
Calil

2009/4/8 cafedrigo <cafe...@gmail.com>



--
(this side down)
Configuracao.cs

Rodrigo Garcia

unread,
Apr 9, 2009, 1:15:13 AM4/9/09
to dotnet...@googlegroups.com
Até onde sei não se pode sobrescrever a sessão de ConnectionStrings dos arquivos de configuração (app.Config ou web.Config)
Uma forma de contornar a situação (O que eu não recomendo), seria criar uma tupla, chave/valor, no sessão appSettings para sua connection string e então vc poderia fazer update da sua pseudo-connection string em runtime com algo do tipo:

System.Configuration.

Configuration config =

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

config.AppSettings.Settings[

"KeyDaSuaConfig"].Value = "NovaConnectionString";

config.Save(

ConfigurationSaveMode.Modified);

ConfigurationManager.RefreshSection("appSettings");
PORÉM, lembrando que no caso da aplicação web, cada vez que o arquivo de configuracao (web.config) é modificado, a aplicação é reiniciada (e todos os usuários logados perderiam sessão, etc.) então vc teria que colocar uma nova sessão no teu web.config apontando para um arquivo .xml externo, e utilizar este arquivo externo para armazenar seus dados da string de conexão.
 
Acho que uma solução mais adequada seria mudar a string de conexão com uma diretiva de compilação, ou seja, como vc desenvolve em modo de compilação DEBUG e provavelmente entrega a aplicação para seu cliente compilada em modo RELEASE, na sua classe que cria o objeto de conexão com o banco de dados vc poderia fazer algo do tipo:
 

string

sNomeConexao = "";

#if

DEBUG

sNomeConexao =

"ConexaoDesenvolvimento";

#else

sNomeConexao = "ConexaoRelease";

#endif

string sConn = ConfigurationManager.ConnectionStrings[sNomeConexao].ConnectionString;

SqlConnection oSqlConn = new SqlConnection(sConn);

.....

e no App.Config

connectionStrings

>

<

clear/>

<

add name="ConexaoDesenvolvimento" connectionString="Integrated Security=SSPI;Initial Catalog=BlaBla;Data Source=SERVER_DEVEL;"/>

<

add name="ConexaoRelease" connectionString="Integrated Security=SSPI;;Initial Catalog=BlaBla;Data Source=SERVER_PROD;"/>

</

connectionStrings>

 

E adicionando duas strings de conexão no seu app.config com os respectivos nomes, sendo que quando estiver trabalhando no desenvolvimento (e compilando em DEBUG), automaticamente utilizará a string de desenvolvimento, e quando compilar em Release para enviar ao cliente já será utilizado a connection string de produção.

 []s
 
Rodrigo Garcia

2009/4/8 cafedrigo <cafe...@gmail.com>



--
Att,

Rodrigo Garcia.
MSN: ro.g...@gmail.com

Alex Tochetto

unread,
Apr 9, 2009, 8:31:41 AM4/9/09
to dotnet...@googlegroups.com
Olá,
   Podes utilizar as classes abaixo para fazer o que você precisa, são bem interessantes e ajudam bastante até para ler parâmetros do seu arquivo de configuração. No método OpenExeConfiguration, você precisa passar o caminho completo mais o nome do seu executável C:\Projeto\App.exe e ele irá automaticamente ler o arquivo de configuração associado.
 
Espero ter ajudado.
 
falow

System

.Configuration.Configuration c = System.Configuration.ConfigurationManager.OpenExeConfiguration(sAppExeConfig);

System.Configuration.ConnectionStringSettingsCollection oConnectionStringCollection = c.ConnectionStrings.ConnectionStrings;

foreach (System.Configuration.ConnectionStringSettings oConnection in oConnectionStringCollection)

{

switch (oConnection.Name)

{

case "default":

break;

}

}

//Get the appSettings section

//System.Configuration.Configuration c = System.Configuration.ConfigurationManager.OpenExeConfiguration(AppSettings.sAppExeConfig);

System.Configuration.AppSettingsSection oAppSettings = (System.Configuration.AppSettingsSection)c.GetSection("appSettings");

if (oAppSettings != null)

{

foreach (string sKey in oAppSettings.Settings.AllKeys)

2009/4/8 cafedrigo <cafe...@gmail.com>

Carlos Angelo Fedrigo Júnior

unread,
Apr 9, 2009, 9:20:16 AM4/9/09
to dotnet...@googlegroups.com
Irei testar hoje a noite as opções enviadas.
 
Obrigado a todos.


 
2009/4/9 Alex Tochetto <alexto...@gmail.com>


"O que não me destroi me torna mais forte"
dr. Matin Luther King Jr.
Reply all
Reply to author
Forward
0 new messages