Modificar los ConnectionStrings en tiempo de ejecución.

A veces, cuando no la mayoría, nos encontramos en la necesidad de modificar los connection string en tiempo de ejecución. Sin embargo, esto choca frontalmente lo que el .NET Framework nos tiene acostumbrados.

Pongamonos en situación: tenemos una aplicación que distribuimos a través de internet y el connection string es el que utilizabamos cuando estabamos en fase de pruebas y la dirección a la que apunta es a localhost. Ahora, una vez que la distribuimos, queremos que los usuarios puedan descargarla y configurarla sin tener que modificar a mano el .exe.config de la aplicación.

¿Cómo lo hacemos?
Pues bien, nos vamos al editor de Settings del Visual Studio.Settings Editor

Aquí lo que haremos será crear una nueva setting que sea del ámbito del usuario para que sea modificable en tiempo de ejecución. Para facilitar las cosas, le pondremos el mismo nombre que la Setting del connection string pero identificandola como la de usuario. (ConnectionStringUser).

Por otro lado, vamos a añadir algo de código extra. Dado que si editamos el Setting.Designer tendremos que hacer las modificaciones una y otra vez (cada vez que modifiquemos las settings), usaremos una clase parcial aparte. Al hacer click en el botón View Code (marcado en rojo aquí en la parte superior) se creará un archivo automáticamente en la raiz de nuestro proyecto llamado Settings.cs con el siguiente aspecto (similar).

namespace Test.Properties {

    // This class allows you to handle specific events on the settings class:
    //  The SettingChanging event is raised before a setting's value is changed.
    //  The PropertyChanged event is raised after a setting's value is changed.
    //  The SettingsLoaded event is raised after the setting values are loaded.
    //  The SettingsSaving event is raised before the setting values are saved.
    internal sealed partial class Settings {

        public Settings() {
            // // To add event handlers for saving and changing settings, uncomment the lines below:
            //
            // this.SettingChanging += this.SettingChangingEventHandler;
            //
            // this.SettingsSaving += this.SettingsSavingEventHandler;
            //
        }

        private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
            // Add code to handle the SettingChangingEvent event here.
        }

        private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
            // Add code to handle the SettingsSaving event here.
        }
    }
}

Para llevar nuestro objetivo a buen puerto, vamos a añadir unas lineas hasta que Setting.cs quede así:

namespace Test.Properties {
    internal sealed partial class Settings {

        public Settings() {
            this.SettingsLoaded += new System.Configuration.SettingsLoadedEventHandler(Settings_SettingsLoaded);
            this.SettingChanging += new System.Configuration.SettingChangingEventHandler(Settings_SettingChanging);
        }

        private void Settings_SettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
        {
            this["ConnectionString"] = this.ConnectionStringUser;
        }

        private void Settings_SettingChanging(object sender, System.Configuration.SettingChangingEventArgs e)
        {
            if(e.SettingName.Equals("ConnectionStringUser"))
                this["ConnectionString"] = this.ConnectionStringUser;
        }
    }
}

Finalmente, vamos a anotar ciertos detalles para que todo salga bien:

  • En el Settings.settings ambos valores deben ser iguales para que en tiempo de compilación no haya descoordinación.
  • Las modificaciones se hacen sobre el NombreSettingUser y se guardan con el método Save de la clase.
  • Todo lo explicado aquí también sirve para los Web Services
Advertisement

6 Responses to “Modificar los ConnectionStrings en tiempo de ejecución.”


  1. 1 Rafa Vargas 25 September 2007 at 16:53

    Es más fácil autoreferenciarme a mi blog cada vez que veo la pregunta en los foros que tener que escribirla una y otra vez :P

    Nos vemos!

  2. 2 PepLluis 25 September 2007 at 16:51

    Genial!! … Ya vamos aprendiendo.
    Lo tendre en cuenta pues es la respuesta a una pregunta muy frecuente.

    Cuidate,
    Pep Lluis,

  3. 3 El Bruno 26 September 2007 at 16:05

    y porq no utilizar directamente EntLib ??

    te abstraes de la base de datos con la q trabajas, posees una herramienta que se encarga de la configuracion de la cadena de conexion a la DB y muchas cosas mas … ;)

    Saludos

  4. 4 Rafa Vargas 27 September 2007 at 20:07

    Pues porque añades una dependencia más al proyecto así como la necesidad de tener que aprender nuevas APIs, etc. Además, lo indico bien en el título del post: “ÑAPA”, por lo tanto, es para salir del paso.

    Sí sólo necesitas la configuración de la cadena de conexión, veo que es mejor hacer esto que añadir más referencias, para otras cosas un poco más grandes, se recupera la inversión en aprender a utilizar la Enterprise Library.

  5. 5 Xavi 6 December 2007 at 13:00

    Y lo mismo para visual basic? como seria?

  6. 6 Félix 26 November 2008 at 16:46

    Yo hize lo siguiente y me funciona :)

    Namespace My

    ‘This class allows you to handle specific events on the settings class:
    ‘ The SettingChanging event is raised before a setting’s value is changed.
    ‘ The PropertyChanged event is raised after a setting’s value is changed.
    ‘ The SettingsLoaded event is raised after the setting values are loaded.
    ‘ The SettingsSaving event is raised before the setting values are saved.
    Partial Friend NotInheritable Class MySettings

    Private Sub MySettings_PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Handles Me.PropertyChanged
    If e.PropertyName.Equals(“connectionStringUser”) Then
    Me(“connectionString”) = Me.connectionStringUser
    End If
    End Sub

    End Class

    End Namespace


Comments are currently closed.



About me


My name is Rafa Vargas. I'm an undergraduate student of Computer Science at University of Seville, Spain. I am mainly interested in computer security, usability and the business of software.

Click here to read the full story.

Twitter subscription

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 6 other followers

Archives


Follow

Get every new post delivered to your Inbox.