13 de abril de 2012

App.config en VS

Al utilizar un app.config para configurar la cadena de conexión a la base de datos la principal ventaja que tiene es que evitaras tener que recompilar tu aplicación si es que vas a cambiar algun dato de la cadena de conexión, Ademas tambien esta la facilidad de modificarlos pues si en cada formulario usas la cadena de conexion, y un dia debes cambiar algo, tendrias que entrar a cada form y cambiar el valor, mientras que en el app.config o bien web.config solo lo cambias una vez y esta listo, claro que usar una clase para guardar los datos de conexion no esta nada mal, pero igual, por lo menos en los lugares que he trabajado utilizan el app.config para guardar los datos de configuración, tu valoraras por tu cuenta la utilidad de este.

ahora para guardar la cadena de conexión en un app.config ya sea en Vb o C# se siguen estos pasos, creamos un nuevo proyecto sea en VB o C# y luego desde el Solution Explorer damos click derecho sobre la aplicación que hemos creado y seleccionamos propiedades




luego nos vamos a la parte de Settings, colocamos un nombre y cambiamos el Type que por defecto tiene el valor de String por Connection string, luego damos click sobre Value en el pequeño botón examinar que aparece al final







después aparece esta ventana para seleccionar el servidor y la base de datos a utilizar, al especificar estos datos damos click en aceptar y luego guardamos, después podemos cerrar la ventana de propiedades





Luego debemos añadir una referencia al proyecto, para esto click derecho sobre la aplicación y luego Add Reference y sobre la pestaña .NET seleccionamos System.Configuration tal como se muestra








ahora, el nombre que yo use para la conexion a la base de datos es: conexion,  hago las pruebas desde mi maquina, me conecto a la base de datos empleado, asi pues el app.config en VB queda tal como se muestra:



y en C# el app.config queda asi:


Ahora se creara una interfaz para navegar a través de los valores de una tabla especifica en nuestra base de datos, ademas que se agregara un DataGridView, BindingNavigator y un textBox para cada dato de nuestra tabla, dicha interfaz de la aplicacion ya sea en VB o C# quedará de la siguiente manera:






App.config en VB


La ventana de la aplicación ejecutandose se muestra a continuacion, el nombre de mi cadena de conexion es "conexion", sabiendo esto, se dan las opciones de utilizar:

Dim cnn As SqlConnection

directamente al ConnectionString
Using cnn = New SqlConnection(ConfigurationManager.ConnectionStrings("conexion").ConnectionString)

my.settings del app.config (solo para VB):
Using cnn = New SqlConnection(My.Settings.conexion)

un modulo (solo para VB)
Using cnn = New SqlConnection(connex) 'conecta con valores desde el modulo los que recupera desde el app.config


una clase
Using cnn = New SqlConnection(k.conexx) 'conecta con valores desde la clase los que recupera desde el app.config

si eres de los que copian y pega código, las opciones aparecen comentariadas con su indicación a la que vez que se entrega al final el código del modulo y de la clase para que funcionen las opciones que te presento, recuérdese solo seleccionar una e importar el system.configuration



Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Public Class Form1
    Dim cnn As SqlConnection
    Dim da As SqlDataAdapter
    Dim dt As DataTable
    Dim bs As New BindingSource
    Dim k As New Class1  'necesario al utilizar la clase para conectarse
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Using cnn = New SqlConnection(ConfigurationManager.ConnectionStrings("conexion").ConnectionString)  
            'Using cnn = New SqlConnection(My.Settings.conexion)  'conecta usando setings del app.config
            'Using cnn = New SqlConnection(connex) 'conecta con valores desde el modulo los que recypera desde el app.config
            'Using cnn = New SqlConnection(k.conexx) 'conecta con valores desde la clase los que recypera desde el app.config
            Using da = New SqlDataAdapter("select * from personal", cnn)
                Using dt = New DataTable
                    da.Fill(dt)
                    bs.DataSource = dt
                    DataGridView1.DataSource = bs
                    BindingNavigator1.BindingSource = bs
                    TextBox1.DataBindings.Add("text", bs, "codigo")
                    TextBox2.DataBindings.Add("text", bs, "nombre")
                    TextBox3.DataBindings.Add("text", bs, "apellido")
                    TextBox4.DataBindings.Add("text", bs, "puesto")
                    TextBox5.DataBindings.Add("text", bs, "sueldo")
                End Using
            End Using
        End Using
    End Sub
End Class



El codigo del modulo es:

Imports System.Data.SqlClient
Imports System.Configuration
Module Module1
    'Public connex As String = My.Settings.conexion  'utilizando My.Settings
    Public connex As String = ConfigurationManager.ConnectionStrings("conexion").ConnectionString.ToString
End Module




El codigo de la clase es:



Imports System.Data.SqlClient
Imports System.Configuration

Public Class Class1
    '    Public conexx As String = My.Settings.conexion  'Utilizando My.Settings
    Public conexx As String = ConfigurationManager.ConnectionStrings("conexion").ConnectionString.ToString
End Class



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



App.config en C#

Aquí no esta la opcion del modulo ni la de My.Settings como en VB, asi que solo presento como alternativa el utilizar una clase, de nuevo la ventana de la aplicacion ejecutandose y el codigo tanto del formulario principal como de la clase que se utiliza como una opcion alternativa se muestra a continuacion


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;

namespace AppconfigenC
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        SqlDataAdapter da;
        DataTable dt;
        SqlConnection cnn;
       //Class1 k= new Class1();    necesario para utilizar informacion desde la clase
        string conex = ConfigurationManager.ConnectionStrings["conexion"].ConnectionString;
        string select = "select * from personal";

                   
        private void Form1_Load(object sender, EventArgs e)
        {
            BindingSource bs;
           using (cnn = new SqlConnection(conex))
           //using (cnn = new SqlConnection(k.cnn))  este utiliza a cnn en la clase Class1
            {
                cnn.Open();
                da = new SqlDataAdapter(select, conex);
                dt = new DataTable();
                da.Fill(dt);
                bs = new BindingSource();
                bs.DataSource = dt;
                bindingNavigator1.BindingSource = bs;
                dataGridView1.DataSource = bs;
                textBox1.DataBindings.Add("text", bs, "codigo");
                textBox2.DataBindings.Add("text", bs, "nombre");
                textBox3.DataBindings.Add("text", bs, "apellido");
                textBox4.DataBindings.Add("text", bs, "puesto");
                textBox5.DataBindings.Add("text", bs, "sueldo");
            }
        }
    }
}





El codigo de la clase es:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;

namespace AppconfigenC
{
    class Class1
    {
       public string cnn = ConfigurationManager.ConnectionStrings["conexion"].ConnectionString.ToString();
    }
}