<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Diário de Códigos &#187; App.config</title>
	<atom:link href="http://diariodecodigos.info/tag/app-config/feed/" rel="self" type="application/rss+xml" />
	<link>http://diariodecodigos.info</link>
	<description>Codigos Fonte, Artigos e Dicas</description>
	<lastBuildDate>Tue, 03 May 2011 17:42:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Editando, Salvando e Atualizando o App.Config em Execução</title>
		<link>http://diariodecodigos.info/2010/02/editando-salvando-e-atualizando-o-app-config-em-execucao/</link>
		<comments>http://diariodecodigos.info/2010/02/editando-salvando-e-atualizando-o-app-config-em-execucao/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 17:15:03 +0000</pubDate>
		<dc:creator>Alexandre Santos</dc:creator>
				<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[App.config]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://diariodecodigos.info/?p=885</guid>
		<description><![CDATA[Problema: Ao montar um aplicativo de relatório, consultando o banco de dados (MySQL) eu precisava iniciar a conexão com o banco de dados mostrando em uma label (&#8220;status&#8221;) se o aplicativo tinha conseguido acessar o database ou não. Caso não, o usuário poderá trocar o endereço do servidor, usuário, senha e schema manualmente. Se ao]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://diariodecodigos.info/wp-content/uploads/2009/09/C.png"><img class="aligncenter size-full wp-image-482" style="margin-top: 2px; margin-bottom: 2px;" title="C#" src="http://diariodecodigos.info/wp-content/uploads/2009/09/C.png" alt="" width="550" height="57" /></a><strong>Problema:</strong> Ao montar um aplicativo de relatório, consultando o banco de dados (MySQL) eu precisava iniciar a conexão com o banco de dados mostrando em uma label (&#8220;status&#8221;) se o aplicativo tinha conseguido acessar o database ou não.</p>
<p style="text-align: left;">Caso não, o usuário poderá trocar o endereço do servidor, usuário, senha e schema manualmente.</p>
<p style="text-align: left;">Se ao trocar os dados a conexão for efetuada com sucesso, salvar uma connectionString no app.config com os novos dados de conexão, para relembrar ao reiniciar o aplicativo.</p>
<p style="text-align: left;">Agora vamos por a mão na massa:<span id="more-885"></span></p>
<ol>
<li>Cria a interface do usuário, no meu caso fico da seguinte maneira:<br />
Figura 1</li>
<li>Criar o arquivo <strong>app.config</strong>:
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;configuration&gt;

  &lt;!-- A sessão a baixo armazena os valores de conexão para serem amostrados nos textBox   --&gt;
  &lt;appSettings&gt;
    &lt;add key=&quot;hostDB&quot; value=&quot;nevada&quot; /&gt;
    &lt;add key=&quot;userDB&quot; value=&quot;alexandre&quot; /&gt;
    &lt;add key=&quot;passwdDB&quot; value=&quot;123456&quot; /&gt;
    &lt;add key=&quot;schemaDB&quot; value=&quot;ddc&quot; /&gt;
  &lt;/appSettings&gt;

  &lt;!-- A sessão abaixo armazena a connectionString utilizada para efetuar a conexão --&gt;
  &lt;connectionStrings&gt;
    &lt;add  name =&quot;ddcConnectionString&quot;
          connectionString =&quot;server=nevada;User Id=alexandre;password=123456;Persist Security Info=True;database=ddc&quot;
          providerName =&quot;MySql.Data.MySqlClientt&quot;  /&gt;
  &lt;/connectionStrings&gt;

&lt;/configuration&gt;
</pre>
</li>
<li>No meu caso eu dei preferência a criar uma classe chamada &#8220;<strong>Database</strong>&#8221; para se uma espécie de &#8220;Connection Factory&#8221;. Mas só tomei essa decisão por estar trabalhando com <strong>ADO.NET</strong>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Configuration;
using System.Data;
using System.Data.Common;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace Relatorios.Classes
{
    class Database
    {
        /// &lt;summary&gt;
        /// Variável onde fica armazenado o Objeto da classe, para ser utilizado no padrão singleton
        /// &lt;/summary&gt;
        private static Database instance;
        String strConn = ConfigurationManager.ConnectionStrings[&quot;awuConnectionString&quot;].ConnectionString;
        MySqlConnection conn = new MySqlConnection();
        MySqlConnectionStringBuilder myCSB = new MySqlConnectionStringBuilder();

        /// &lt;summary&gt;
        /// Propriedade que armazena a instância da classe
        /// &lt;/summary&gt;
        private Database() { }

        /// &lt;summary&gt;
        /// Método get que fornece a instância da classe (Padrão Singleton, lembrando que não existe o método 'set' neste caso)
        /// &lt;/summary&gt;
        public static Database Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Database();
                }
                return instance;
            }
        }

        // Fim da implementação do padrão singleton

        /// &lt;summary&gt;
        /// Endereço do servidor do Banco de Dados
        /// &lt;/summary&gt;
        public String hostDB { get; set; }
        /// &lt;summary&gt;
        /// Usuário do Banco de dados
        /// &lt;/summary&gt;
        public String userDB { get; set; }
        /// &lt;summary&gt;
        /// Senha para acessar o Banco de Dados
        /// &lt;/summary&gt;
        public String passwdDB { get; set; }
        /// &lt;summary&gt;
        /// Schema a ser acessado no Banco de Dados
        /// &lt;/summary&gt;
        public String schemaDB { get; set; }

        /// &lt;summary&gt;
        /// Cria a conexão com o banco de dados e retorna um objeto do tipo DBConnection (System.Data.Common)
        /// &lt;/summary&gt;
        /// &lt;returns&gt;DbConnection&lt;/returns&gt;
        public DbConnection connectar()
        {

            try
            {
                conn.ConnectionString = strConn;
                conn.Open(); // Abrindo conexão...
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
                // Se a conexão ñ for bem sucedida, tenta usar os parâmetros da classe
                if (conn.State != ConnectionState.Open)
                {
                    // Cria uma nova string de conexão com o MySQLConnectionStringBuilder
                    myCSB.Server = this.hostDB;
                    myCSB.UserID = this.userDB;
                    myCSB.Password = this.passwdDB;
                    myCSB.Database = this.schemaDB;

                    // Passa a nova ConnectionString para o objeto de conexão
                    conn.ConnectionString = myCSB.ConnectionString;
                    try
                    {
                        conn.Open(); // Tenta se conectar novamente
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }

            return conn;
        }

        /// &lt;summary&gt;
        /// Cria uma string de conexão e retorna-o
        /// &lt;/summary&gt;
        /// &lt;returns&gt;string&lt;/returns&gt;
        public string createStringConnection()
        {

            myCSB.Server = this.hostDB;
            myCSB.UserID = this.userDB;
            myCSB.Password = this.passwdDB;
            myCSB.Database = this.schemaDB;

            return myCSB.ConnectionString;
        }
    }
}
</pre>
</li>
<li>Nesse projeto, eu estou utilizando windows form, abaixo segue a imagem do Form principal (o primeiro a ser aberto), mapeado com o nome dos objetos mais importantes:<br />
<a href="http://diariodecodigos.info/wp-content/uploads/2010/02/windowsForm.jpg"><img class="aligncenter size-full wp-image-895" style="margin-top: 1px; margin-bottom: 1px; border: 1px solid black;" title="windowsForm" src="http://diariodecodigos.info/wp-content/uploads/2010/02/windowsForm.jpg" alt="" width="492" height="386" /></a></li>
<li>Agora segue o código do form, fazendo a mágica&#8230;
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace Relatorios
{
    public partial class FMain : Form
    {

        public FMain()
        {
            InitializeComponent();
        }

        // Busca o arquivo de configuração
        Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

       // Ao abrir a janela principal, executar:
        private void FMain_Load(object sender, EventArgs e)
        {
            // Pucha as variáveis pré definidas do app.config
            txtServer.Text = ConfigurationManager.AppSettings[&quot;hostDB&quot;];
            txtUser.Text = ConfigurationManager.AppSettings[&quot;userDB&quot;];
            txtPassword.Text = ConfigurationManager.AppSettings[&quot;passwdDB&quot;];
            txtDatabase.Text = ConfigurationManager.AppSettings[&quot;schemaDB&quot;];

            // Tentar se conectar
            Classes.Database db = Classes.Database.Instance;
            DbConnection conn = db.connectar();

            if (conn.State == ConnectionState.Open)
            {
                lblStatus.Text = &quot;Conectado&quot;;
                lblStatus.ForeColor = Color.Blue;
            }
            else
            {
                lblStatus.Text = &quot;Não foi possível conectar ao Banco de Dados&quot;;
                lblStatus.ForeColor = Color.Red;
            }

        }

        /** Ao clicar no botão &quot;connectar&quot;, criar a conexão com os parâmetros
         *   passados pelo usuário na janela principal
        */
        private void button1_Click(object sender, EventArgs e)
        {
            AppSettingsSection appSetSec = configFile.AppSettings;

            Classes.Database db = Classes.Database.Instance;
            db.hostDB = txtServer.Text;
            db.userDB = txtUser.Text;
            db.passwdDB = txtPassword.Text;
            db.schemaDB = txtDatabase.Text;

            DbConnection conn = db.connectar();

            if (conn.State == ConnectionState.Open)
            {
                lblStatus.Text = &quot;Conectado&quot;;
                lblStatus.ForeColor = Color.Blue;
                appSetSec.Settings[&quot;hostDB&quot;].Value = txtServer.Text;
                appSetSec.Settings[&quot;userDB&quot;].Value = txtUser.Text;
                appSetSec.Settings[&quot;passwdDB&quot;].Value = txtPassword.Text;
                appSetSec.Settings[&quot;schemaDB&quot;].Value = txtDatabase.Text;

                // Retorna a seção do connectionStrings.
                ConnectionStringsSection csSection = configFile.ConnectionStrings;

                // apaga a connectionString atual
                csSection.ConnectionStrings.Remove(&quot;awuConnectionString&quot;);

                // adiciona a nova connectionString
                csSection.ConnectionStrings.Add(new ConnectionStringSettings(&quot;awuConnectionString&quot;, &quot;server=&quot; + txtServer.Text + &quot;;User Id=&quot; + txtUser.Text + &quot;;password=&quot; + txtPassword.Text + &quot;;Persist Security Info=True;database=&quot; + txtDatabase.Text + &quot;&quot;, &quot;MySql.Data.MySqlClient&quot;));

                // Salva a nova connectionStriong
                configFile.Save();

                // Atualiza a nova seção (faz o aplicativo reler do HD a connectionString se for utilizada novamente
                ConfigurationManager.RefreshSection(&quot;connectionStrings&quot;);
                // Atualiza a seção do appString também
                ConfigurationManager.RefreshSection(&quot;appSettings&quot;);
            }
            else
            {
                lblStatus.Text = conn.ConnectionString;
            }

        }

        // Item do menu da caixa de dialogo &quot;Sobre&quot;
        private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AboutBox abox = new AboutBox();
            abox.ShowDialog();
        }

        // Item do menu da janela de relatório &quot;Resumo Financeiro Angolano&quot;
        private void angolanoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Academicos.frmResumoFinanceiroAng frmReport = new Relatorios.Academicos.frmResumoFinanceiroAng();
            frmReport.Show();
        }

    }
}
</pre>
</li>
</ol>
<p>Pronto!</p>
<p>Quero agradecer e dar créditos também ao nosso amigo <strong>Paulo Diogo</strong> que me ajudou muito a fazer isso.</p>
<p>Abraços&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://diariodecodigos.info/2010/02/editando-salvando-e-atualizando-o-app-config-em-execucao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Reescrever App.config em tempo de execução!</title>
		<link>http://diariodecodigos.info/2009/06/reescrever-app-config-em-tempo-de-execucao/</link>
		<comments>http://diariodecodigos.info/2009/06/reescrever-app-config-em-tempo-de-execucao/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 18:50:00 +0000</pubDate>
		<dc:creator>paulodiogo</dc:creator>
				<category><![CDATA[C# Dicas]]></category>
		<category><![CDATA[App.config]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://diariodecodigos.wordpress.com/2009/06/25/reescrever-app-config-em-tempo-de-execucao/</guid>
		<description><![CDATA[1º fazer a classe AppConfig.cs public enum ConfigFileType { WebConfig , AppConfig } &#60;span id=&#34;more-17&#34;&#62;&#60;/span&#62; public class AppConfig : System.Configuration.AppSettingsReader { public string docName = String.Empty; private XmlNode node=null; private int _configType; public int ConfigType { get { return _configType; } set { _configType=value; } } public bool SetValue(string key, string value) { XmlDocument cfgDoc]]></description>
			<content:encoded><![CDATA[<p>1º fazer a classe AppConfig.cs</p>
<pre class="brush: csharp;">public enum   ConfigFileType
{
 WebConfig ,
 AppConfig
}

&lt;span id=&quot;more-17&quot;&gt;&lt;/span&gt;

public class AppConfig : System.Configuration.AppSettingsReader
{
 public string  docName = String.Empty;
 private  XmlNode node=null;
    private int _configType;

 public   int ConfigType
 {
  get
  {
   return _configType;
  }
  set
  {
   _configType=value;
  }
 }

 public bool SetValue(string key, string value)
 {
  XmlDocument cfgDoc = new XmlDocument();
  loadConfigDoc(cfgDoc);
   // retrieve the appSettings node
        node = cfgDoc.SelectSingleNode(&amp;quot;//connectionStrings&amp;quot;);

   if( node == null )
   {
                throw new System.InvalidOperationException(&amp;quot;connectionStrings section not found&amp;quot;);
   }

  try
  {
   // XPath select setting &amp;quot;add&amp;quot; element that contains this key
   XmlElement addElem= (XmlElement)node.SelectSingleNode(&amp;quot;//add[@name='&amp;quot; +key +&amp;quot;']&amp;quot;) ;
   if (addElem!=null)
   {
    addElem.SetAttribute(&amp;quot;value&amp;quot;,value);
   }
    // not found, so we need to add the element, key and value
   else
   {
    XmlElement entry = cfgDoc.CreateElement(&amp;quot;add&amp;quot;);
    entry.SetAttribute(&amp;quot;name&amp;quot;,key);
                entry.SetAttribute(&amp;quot;connectionString&amp;quot;, value);
    node.AppendChild(entry);
   }
   //save it
   saveConfigDoc(cfgDoc,docName);
   return true;
  }
  catch
  {
   return false;
  }
 }

 private void saveConfigDoc(XmlDocument cfgDoc,string cfgDocPath)
 {
  try
  {
   XmlTextWriter writer = new XmlTextWriter( cfgDocPath , null );
   writer.Formatting = Formatting.Indented;
   cfgDoc.WriteTo( writer );
   writer.Flush();
   writer.Close();
   return;
  }
  catch
  {
   throw;
  }
 }

 public bool removeElement ( string elementKey)
 {
  try
  {
   XmlDocument cfgDoc = new XmlDocument();
   loadConfigDoc(cfgDoc);
   // retrieve the appSettings node
            node = cfgDoc.SelectSingleNode(&amp;quot;//connectionStrings&amp;quot;);
   if( node == null )
   {
                throw new System.InvalidOperationException(&amp;quot;connectionStrings section not found&amp;quot;);
   }
   // XPath select setting &amp;quot;add&amp;quot; element that contains this key to remove
   node.RemoveChild( node.SelectSingleNode(&amp;quot;//add[@name='&amp;quot; +elementKey +&amp;quot;']&amp;quot;) );

   saveConfigDoc(cfgDoc,docName);
   return true;
  }
  catch
  {
   return false;
  }
 }

 private XmlDocument loadConfigDoc( XmlDocument cfgDoc )
 {
  // load the config file
        Console.WriteLine(Convert.ToInt32(ConfigFileType.AppConfig)+&amp;quot;___&amp;quot;+Convert.ToInt32(ConfigType));

  if(  Convert.ToInt32(ConfigType)==0)
  {

   docName= ((Assembly.GetEntryAssembly()).GetName()).Name;
   docName +=   &amp;quot;.exe.config&amp;quot;;
  }
  else
  {
   docName=System.Web.HttpContext.Current.Server.MapPath(&amp;quot;web.config&amp;quot;);
  }
  cfgDoc.Load( docName );
  return cfgDoc;
 }

}</pre>
<p>2º Na hora de usar</p>
<pre class="brush: csharp;">
AppConfig config = new AppConfig();
            config.removeElement(&quot;localhostcs&quot;);
            config.SetValue(&quot;QUAL KEY QUER MUDAR?&quot;, &quot;O QUE QUER ADD?&quot;);</pre>
<p>ps. o codigo da classe Appconfig.cs esta pronto para mudar a connectio string<br />
portanto prestar atenção na hora de mudar&#8230; mude para aquilo que vc quer mudar no seu app.config =D</p>
<p>flw</p>
]]></content:encoded>
			<wfw:commentRss>http://diariodecodigos.info/2009/06/reescrever-app-config-em-tempo-de-execucao/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

