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.
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

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!
Genial!! … Ya vamos aprendiendo.
Lo tendre en cuenta pues es la respuesta a una pregunta muy frecuente.
Cuidate,
Pep Lluis,
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
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.
Y lo mismo para visual basic? como seria?
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