Array
(
)

Problemas com o arquivo app.config

Allan Roberto
   - 28 set 2010


  Seguinte, estou desenvolvendo uma pequena aplicação, e estou com o seguinte problema... no meu arquivo app.config estão os dados para connectionString, qndo não é possível efetuar a conexão no banco de dados, eu edito os parâmetros da connectionString em tempo de execução, ela dá um refresh na connectionString e viabiliza a conexão com o banco de dados. Porém, ela não substitui os valores incorretos no arquivo de configuração, aí toda vez q executo a aplicação tenho q reconfigurar... segue o código abaixo...

Tela:

app.config:<?xml version="1.0" encoding="utf-8" ?><configuration>  <!-- A sessão abaixo armazena os valores de conexão para serem amostrados nos textbox -->  <appSettings>    <add key="Servidor" value="10.74.2.16,1433"/>    <add key="InstBanco" value="DBMSSOCN"/>    <add key="Banco" value="agenda"/>    <add key="Usuario" value="sa"/>    <add key="Senha" value="kerberos"/>  </appSettings>    <!-- A sessão abaixo armazena a connectionString utilizada para efetuar a conexão -->  <connectionStrings>    <add name="conexaoDB"         connectionString="Data Source=10.74.2.16,1433; Network Library=DBMSSOCN; Initial Catalog=agenda;User ID=sa;Password=kerberos"         providerName="System.Data.SqlClient"/>  </connectionStrings></configuration>
Classe para conexão:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Configuration;using System.Data;using System.Data.SqlClient;using System.Data.Common;using System.Diagnostics;
namespace sga{    class connDB    {        ///<summary>        ///Variável onde fica armazenado o objeto da classe, para ser utilizado no padrão singleton        /// </summary>        private static connDB instance;
        String strConn = ConfigurationManager.ConnectionStrings["conexaoDB"].ConnectionString;                SqlConnection conn = new SqlConnection();        SqlConnectionStringBuilder myCSB = new SqlConnectionStringBuilder();
        /// <summary>        /// Propriedade que armazena a instância da classe        /// </summary>                private connDB() { }
        /// <summary>        /// Método get que fornece a instância da classe (padrão Singleton, lembrando que não existe método 'set' neste caso)        /// </summary>
        public static connDB Instance        {            get            {                if (instance == null)                {                    instance = new connDB();                }                return instance;            }        }                //fim da implementação padrão singleton
        /// <summary>        /// Endereço do servidor do banco de dados        /// </summary>        public String Servidor { get; set; }                /// <summary>        /// Conexão via tcp/ip        /// </summary>        public String InstBanco { get; set; }
        /// <summary>        /// Nome do banco de dados        /// </summary>        public String Banco { get; set; }
        /// <summary>        /// Usuário do banco de dados        /// </summary>        public String Usuario { get; set; }
        /// <summary>        /// Senha do banco de dados        /// </summary>        public String Senha { get; set; }
        public DbConnection conectar()        {            try            {                conn.ConnectionString = strConn;
                if (conn.State != ConnectionState.Open)                {                    //cria uma nova string de conexao                    myCSB.DataSource = this.Servidor;                    myCSB.NetworkLibrary = this.InstBanco;                    myCSB.InitialCatalog = this.Banco;                    myCSB.UserID = this.Usuario;                    myCSB.Password = this.Senha;
                    conn.ConnectionString = myCSB.ConnectionString;
                    try                    {                        conn.Open();                    }                    catch (Exception ex1)                    {                        Console.WriteLine(ex1.Message);                    }                }                else                    conn.Open();            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }            return conn;        }
        public string novaStringConn()        {            myCSB.DataSource = this.Servidor;            myCSB.NetworkLibrary = this.InstBanco;            myCSB.InitialCatalog = this.Banco;            myCSB.UserID = this.Usuario;            myCSB.Password = this.Senha;
            return myCSB.ConnectionString;        }    }}
código do formulário:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.Common;using System.Data.SqlClient;using System.Drawing;using System.Linq;using System.Configuration;using System.Text;using System.Windows.Forms;
namespace sga{    public partial class frm_conexao : Form    {        public frm_conexao()        {            InitializeComponent();        }
        //Busca arquivo de configuração        Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        //Ao abrir a janela principal executar        private void frm_conexao_Load(object sender, EventArgs e)        {            //puxa as variáveis pré definidas do app.config            txtServidor.Text = ConfigurationManager.AppSettings["Servidor"];            txtInstancia.Text = ConfigurationManager.AppSettings["InstBanco"];            txtBanco.Text = ConfigurationManager.AppSettings["Banco"];            txtUsuario.Text = ConfigurationManager.AppSettings["Usuario"];            txtSenha.Text =  ConfigurationManager.AppSettings["Senha"];
            //tentar conectar            connDB db = connDB.Instance;            DbConnection conn = db.conectar();
            if (conn.State == ConnectionState.Open)            {                lblStatus.Text = "Conectado";                lblStatus.ForeColor = Color.Blue;            }            else            {                lblStatus.Text = "Não conectado";                lblStatus.ForeColor = Color.Red;            }        }
        private void btnConectar_Click(object sender, EventArgs e)        {            AppSettingsSection appSetSec = configFile.AppSettings;
            connDB db = connDB.Instance;            db.Servidor = txtServidor.Text;            db.InstBanco = txtInstancia.Text;            db.Banco = txtBanco.Text;            db.Usuario = txtUsuario.Text;            db.Senha = txtSenha.Text;
            DbConnection conn = db.conectar();
            if (conn.State == ConnectionState.Open)            {                lblStatus.Text = "Conectado";                lblStatus.ForeColor = Color.Blue;                appSetSec.Settings["Servidor"].Value = txtServidor.Text;                appSetSec.Settings["InstBanco"].Value = txtInstancia.Text;                appSetSec.Settings["Banco"].Value = txtBanco.Text;                appSetSec.Settings["Usuario"].Value = txtUsuario.Text;                appSetSec.Settings["Senha"].Value = txtSenha.Text;
                //Retorna a seção do connectionStrings                ConnectionStringsSection csSection = configFile.ConnectionStrings;
                //Apaga a connectionString atual                csSection.ConnectionStrings.Remove("conexaoDB");
                //Adiciona a nova connectionString                csSection.ConnectionStrings.Add(new ConnectionStringSettings("conexaoDB",                    "Data Source=" + txtServidor.Text + "; Network Library=" + txtInstancia.Text +                    "; Initial Catalog=" + txtBanco.Text + "; User ID=" + txtUsuario.Text +                    "; Password=" + txtSenha.Text, "System.Data.SqlClient"));
                //Salva a nova connectionString                configFile.Save();
                //Atualiza a nova seção (faz o aplicativo reler do HD a connectrionString se for utilizada novamente                ConfigurationManager.RefreshSection("connectionStrings");
                //Atualiza a seção do appSettings também                ConfigurationManager.RefreshSection("appSettings");            }            else            {                lblStatus.Text = conn.ConnectionString;            }        }    }}

Allan Roberto
   - 30 set 2010

// Referência ao arquivo de configuração do o aplicativo.System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);// Uma seção connectionStrings.ConnectionStringsSection csSection = config.ConnectionStrings;// Adiona string de conexão à seçãocsSection.ConnectionStrings.Add(new ConnectionStringSettings("Nome", "String de conexão aqui", "Nome do Provider"));// Grava.config.Save(ConfigurationSaveMode.Modified);
 

Allan Roberto
   - 01 out 2010


  fiz o teste e o código está funcionando