Codigos Fonte, Artigos e Dicas
Editando, Salvando e Atualizando o App.Config em Execução
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 (“status”) 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 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.
Agora vamos por a mão na massa:
- Cria a interface do usuário, no meu caso fico da seguinte maneira:
Figura 1 - Criar o arquivo app.config:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- A sessão a baixo armazena os valores de conexão para serem amostrados nos textBox --> <appSettings> <add key="hostDB" value="nevada" /> <add key="userDB" value="alexandre" /> <add key="passwdDB" value="123456" /> <add key="schemaDB" value="ddc" /> </appSettings> <!-- A sessão abaixo armazena a connectionString utilizada para efetuar a conexão --> <connectionStrings> <add name ="ddcConnectionString" connectionString ="server=nevada;User Id=alexandre;password=123456;Persist Security Info=True;database=ddc" providerName ="MySql.Data.MySqlClientt" /> </connectionStrings> </configuration> - No meu caso eu dei preferência a criar uma classe chamada “Database” para se uma espécie de “Connection Factory”. Mas só tomei essa decisão por estar trabalhando com ADO.NET
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 { /// <summary> /// Variável onde fica armazenado o Objeto da classe, para ser utilizado no padrão singleton /// </summary> private static Database instance; String strConn = ConfigurationManager.ConnectionStrings["awuConnectionString"].ConnectionString; MySqlConnection conn = new MySqlConnection(); MySqlConnectionStringBuilder myCSB = new MySqlConnectionStringBuilder(); /// <summary> /// Propriedade que armazena a instância da classe /// </summary> private Database() { } /// <summary> /// Método get que fornece a instância da classe (Padrão Singleton, lembrando que não existe o método 'set' neste caso) /// </summary> public static Database Instance { get { if (instance == null) { instance = new Database(); } return instance; } } // Fim da implementação do padrão singleton /// <summary> /// Endereço do servidor do Banco de Dados /// </summary> public String hostDB { get; set; } /// <summary> /// Usuário do Banco de dados /// </summary> public String userDB { get; set; } /// <summary> /// Senha para acessar o Banco de Dados /// </summary> public String passwdDB { get; set; } /// <summary> /// Schema a ser acessado no Banco de Dados /// </summary> public String schemaDB { get; set; } /// <summary> /// Cria a conexão com o banco de dados e retorna um objeto do tipo DBConnection (System.Data.Common) /// </summary> /// <returns>DbConnection</returns> 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; } /// <summary> /// Cria uma string de conexão e retorna-o /// </summary> /// <returns>string</returns> public string createStringConnection() { myCSB.Server = this.hostDB; myCSB.UserID = this.userDB; myCSB.Password = this.passwdDB; myCSB.Database = this.schemaDB; return myCSB.ConnectionString; } } } - 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:

- Agora segue o código do form, fazendo a mágica…
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["hostDB"]; txtUser.Text = ConfigurationManager.AppSettings["userDB"]; txtPassword.Text = ConfigurationManager.AppSettings["passwdDB"]; txtDatabase.Text = ConfigurationManager.AppSettings["schemaDB"]; // Tentar se conectar Classes.Database db = Classes.Database.Instance; DbConnection conn = db.connectar(); if (conn.State == ConnectionState.Open) { lblStatus.Text = "Conectado"; lblStatus.ForeColor = Color.Blue; } else { lblStatus.Text = "Não foi possível conectar ao Banco de Dados"; lblStatus.ForeColor = Color.Red; } } /** Ao clicar no botão "connectar", 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 = "Conectado"; lblStatus.ForeColor = Color.Blue; appSetSec.Settings["hostDB"].Value = txtServer.Text; appSetSec.Settings["userDB"].Value = txtUser.Text; appSetSec.Settings["passwdDB"].Value = txtPassword.Text; appSetSec.Settings["schemaDB"].Value = txtDatabase.Text; // Retorna a seção do connectionStrings. ConnectionStringsSection csSection = configFile.ConnectionStrings; // apaga a connectionString atual csSection.ConnectionStrings.Remove("awuConnectionString"); // adiciona a nova connectionString csSection.ConnectionStrings.Add(new ConnectionStringSettings("awuConnectionString", "server=" + txtServer.Text + ";User Id=" + txtUser.Text + ";password=" + txtPassword.Text + ";Persist Security Info=True;database=" + txtDatabase.Text + "", "MySql.Data.MySqlClient")); // 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("connectionStrings"); // Atualiza a seção do appString também ConfigurationManager.RefreshSection("appSettings"); } else { lblStatus.Text = conn.ConnectionString; } } // Item do menu da caixa de dialogo "Sobre" private void sobreToolStripMenuItem_Click(object sender, EventArgs e) { AboutBox abox = new AboutBox(); abox.ShowDialog(); } // Item do menu da janela de relatório "Resumo Financeiro Angolano" private void angolanoToolStripMenuItem_Click(object sender, EventArgs e) { Academicos.frmResumoFinanceiroAng frmReport = new Relatorios.Academicos.frmResumoFinanceiroAng(); frmReport.Show(); } } }
Pronto!
Quero agradecer e dar créditos também ao nosso amigo Paulo Diogo que me ajudou muito a fazer isso.
Abraços….
Posts Relacionados
| Imprimir artigo | Este artigo foi escrito por Alexandre Santos em 25 25UTC fevereiro 25UTC 2010 às 15:15, e está arquivado em ADO.NET. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |

há 1 ano atrás
escreveu demais nesse exemplo… complica o entendimento.
[Reply]
há 1 ano atrás
Conteúdo perfeito pra o que eu queria fazer. Parabéns.
[Reply]
há 1 ano atrás
Conteúdo perfeito pra o que eu queria fazer. Parabéns.
[Reply]