domingo, 23 de noviembre de 2014

[c#] Cambiar ConnectionString almacenado en "Settings" del proyecto en tiempo de ejecución

C# tiene un conjunto de herramientas que hacen que la programación sea mas cómoda y robusta en este caso podemos trabajar directamente con una configuración predeterminada y almacenada dentro del archivo de configuracion en este caso app.config, es muy cómodo para cuando se hace la implementación no tener que cambiar los parámetros de forma local por lo que vamos a configurarlos en tiempo de ejecución.



Para esta configuración en especial se complica un poco ya que el scope de las cadenas de conexion es aplicación por lo que no pueden ser modificadas con un simple "set", por lo que primero puedes hacer lo siguiente.

Primero verificaremos que nos hizo visual  con respecto a la configuración visual que hicimos por lo que abrimos el archivo app.config  en este caso el mio tiene lo siguiente:



    
    
    
      
        
    


En este caso revisemos primero la etiqueta <clear /> es para que las conexiones heredadas no se agreguen a la configuración por ejemplo yo trabajo con mysql por lo si no pongo este parámetro tendré una configuración adicional a SQLExpress que no la necesito por lo que me deshago de ella en el ejecutable.

Segundo el parámetro que viene en la cadena de conexión de name regularmente esta formado por "nombreProyecto.properties.settings.name" puedes borrar todo y dejar name para que puedas acceder desde el código.

Pasamos a la modificación de la cadena de conexión supongamos que tenemos el método siguiente:
 public void cambiarDatosServer(string localhost, string user, string pass)
        {            
            String cadenaNueva = "server=" + localhost + ";user id=" + user + ";password=" + pass + ";persistsecurityinfo=True;database=namedb";
            //abrimos la configuración de nuestro proyecto
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            //hacemos la modificacion de la cadena de conexion (ServerDb es el atributo que tengo en app.config) 
            config.ConnectionStrings.ConnectionStrings["ServerDb"].ConnectionString = cadenaNueva;
            //Cambiamos el modo de guardado
            config.Save(ConfigurationSaveMode.Modified,true);
            // modificamos el guardado 
            Settings.Default.Save();   
            //Podemos revisar en la consola que configuraciones quedaron despues del comando
            //aqui en adelante es opcional        
            ConnectionStringSettingsCollection settings =
            ConfigurationManager.ConnectionStrings;
            if (settings != null)
            {
                foreach (ConnectionStringSettings cs in settings)
                {
                    Console.WriteLine(cs.Name);
                    Console.WriteLine(cs.ProviderName);
                    Console.WriteLine(cs.ConnectionString);
                }
            }
        }

Se lleva tres parámetros que son básicos el servidor (Ip ), usuario y password, los cuales forma una cadena de conexión en la variable cadenaNueva.

Posteriormente creamos un objeto del tipo Configuration que podemos usar para que pueda modificar y quitar el nivel de permiso de la aplicación para guardar y posteriormente guardarlo en las configuraciones por default de nuestra aplicación con esto tendremos una cadena de conexión que puede cambiar en tiempo de ejecución.




4 comentarios:

  1. por Dios por fin lo encontre que este bien explicado y que funcione, gracias amigo lo necesitaba mucho.

    ResponderEliminar
  2. Muy bueno tu articulo, pero necesito que el archivo APP.CONFIG se modifique fisicamente en el interfaz y hasta ahora no lo he conseguido, podrias ayudarme porfavor, estoy con WPF C# solo para poder modificar en cualquier momento la ruta de la base de datos, gracias por la atencion

    ResponderEliminar
  3. Perdon, me olvide decir que mi base de datos esta en appserver localhost, no es mysqlServer

    ResponderEliminar