Está en la página 1de 1

This site uses cookies: Find out more.

Okay, thanks

Home

[HowTo] Modificar cadena de conexión, la Tags


eterna pregunta
async Back best practices

By lfranco Oct-20-2011 Sin categoría 1 Comment.

Search
Si no la he leído 200 veces en los foros MSDN no la he leído ninguna vayan
unos ejemplos:
Entradas recientes
Es posible modificar el App.config de una aplicación C# en tiempo de
Video de mi charla en la
ejecución? #dotNetSpain2016 ERROR pa
sitio web:
el dominio
Cómo hago para cambiar los datos de conexión en tiempo de I’m back. Miss me? web no es
ejecución?
Office365 actualizado a 2013
Cadena de conexión Dinámica, ¿cómo debo hacer esta modificación para nuevas suscripciones
desde un windows form en el mismo aplicativo?
Serializar listas genéricas en
aplicaciones WinRT
Y así unas cuantas. De hecho una búsqueda me ha arrojado más de 3.000
resultados :-S [TPL] Problemas de
concurrencia
De todos modos lo que me sorprende no es tanto el alto número de veces que
se hace esta pregunta, sino que cada vez que la respondo me digo a mi Comentarios recientes
mismo: Haz un post y publícalo para referenciar a la gente… y siempre se me
olvida
Darling Chavez en Tip: Mostrar
Bueno, pues de hoy no pasa. Y es que curiosamente me ha llegado la misma objetos relacionados en
DevExpress GridControl
pregunta por dos medios distintos. Uhm… casualidad? No lo creo. Sin duda
es una señal divina: El MEV me está hablando y yo -pobre mortal- debo Alexander en [TPL] Problemas de
obedecer. concurrencia

App.config y Machine.config cristinakity en Funciones


escalares en TSQL, JOINS,
A ver, el quid de la cuestión es que la primera vez que usamos una cadena de CROSS APPLY, y la madre que
conexión (en un DataSource, Contexto de datos, etc.) el propio Visual Studio parió al topo.
genera en el fichero app.config una entrada con nombre para nuestra
cristinakity en Funciones
aplicación. Esta entrada es parecida a esto:
escalares en TSQL, JOINS,
<connectionStrings>
CROSS APPLY, y la madre que
parió al topo.
<clear />

anonymous en HowTo: Crear una


<add name="YourApp.Properties.Settings.YourAppConnectionString"
pantalla de inicio (splash screen)
connectionString="Data Source=.sqlexpress;Initial Catalog=YourDataBase;Integrated Security=True

Archivos
providerName="System.Data.SqlClient" />

</connectionStrings>

marzo 2016
Y sirve para que si alguna vez deseamos cambiar el nombre del servidor, o la
base de datos, o cualquier otro atributo, lo hagamos en un único sitio. marzo 2013

Antes de seguir un detalle: ¿Os habéis fijado si en vuestro app.config tenéis octubre 2012
un clear antes de la cadena de conexión? Si no lo tenéis, os aconsejo
añadirlo. Este clear lo que hace es no cargar las cadenas de conexión del septiembre 2012
fichero machine.config, que es común a todas las aplicaciones.
agosto 2012
Y es que cuando se inicia una aplicación de .NET, se cargan las secciones
febrero 2012
comunes del machine.config y a continuación se añaden las propias de la
aplicación definidas en el app.config. diciembre 2011

Como por defecto en el machine.config tenemos esto: noviembre 2011


<connectionStrings>
octubre 2011
<add name="LocalSqlServer" connectionString="data source=.SQLEXPRESS;Integrated Security=SSPI;

septiembre 2011
AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlC

</connectionStrings> agosto 2011

Si no usamos el tag clear, al ejecutar nuestra aplicación tendremos dos junio 2011
cadenas de conexión, y la primera será la del machine.config… y eso no nos
mayo 2011
gusta

abril 2011
Así que asumiendo que ya habéis agregado el tag clear, vamos al turrón.

febrero 2011
System.Configuration
enero 2011
En este ensamblado encontraremos todo lo necesario para la gestión de
nuestras cadenas de configuración (y muchas cosas más). diciembre 2010

Lo primero es agregar una referencia a este ensamblado a nuestro proyecto: noviembre 2010

octubre 2010

agosto 2010

julio 2010

marzo 2010

febrero 2010

enero 2010

diciembre 2009

noviembre 2009

octubre 2009

septiembre 2009

agosto 2009

julio 2009
Y a continuación crearemos una clase con un par de métodos para leer y
junio 2009
guardar las cadenas de conexión en el app.config:

public class ConnectionStringManager


mayo 2009

{ abril 2009
public static string GetConnectionString(string connectionStringName)
marzo 2009
{

febrero 2009
Configuration appconfig =

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); enero 2009

ConnectionStringSettings connStringSettings = appconfig.ConnectionStrings.ConnectionStrings


diciembre 2008
return connStringSettings.ConnectionString;
noviembre 2008
}

octubre 2008

public static void SaveConnectionString(string connectionStringName, string connectionString) septiembre 2008

{
agosto 2008
Configuration appconfig =
julio 2008
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

appconfig.ConnectionStrings.ConnectionStrings[connectionStringName].ConnectionString = conn junio 2008

appconfig.Save(); mayo 2008


}
abril 2008
}

marzo 2008
Básicamente, al primero se le pasa el nombre de la cadena de conexión a
recuperar (por si tenemos varias) y nos devuelve la cadena de conexión. Al febrero 2008
segundo se le pasa el nombre de la cadena de conexión y la nueva cadena de
conexión modificada. enero 2008

diciembre 2007
Para hacerlo un poco más sencillo y no tener que recordar el nombre de las
cadenas de conexión, vamos a crear algunos métodos más en la clase. Uno
noviembre 2007
que retorne la lista de nombres de las cadenas de conexión del fichero de
configuración, y otro que retorne sólo el nombre de la primera (muy útil si sólo octubre 2007
tenemos una).
septiembre 2007
public static List<string> GetConnectionStringNames()

{
agosto 2007

List<string> cns = new List<string>(); abril 2007

Configuration appconfig =
febrero 2007
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

enero 2007
foreach (ConnectionStringSettings cn in appconfig.ConnectionStrings.ConnectionStrings)

{
Categorías
cns.Add(cn.Name);

}
.NET

return cns; C#
}
Channel9

Evento
public static string GetFirstConnectionStringName()

{ Personal

return GetConnectionStringNames().FirstOrDefault();
Videos
}

Incluso, basándonos en este último podemos crear otro que nos devuelva la
Meta
primera cadena de conexión:
Acceder
public static string GetFirstConnectionString()

RSS de las entradas


{

return GetConnectionString(GetFirstConnectionStringName()); RSS de los comentarios

}
WordPress.org

Let’s play!

A partir de esta clase, trabajar con las cadenas de conexión es muy sencillo.
Supongamos que tenemos un formulario similar a esto:

Leer los valores de la cadena de conexión y mostrarlos es tan sencillo como


esto:

private void showSavedConnectionSettings()

SqlConnectionStringBuilder builder =

new SqlConnectionStringBuilder(ConnectionStringManager.GetFirstConnectionString());

connectionServerComboBox.EditValue = builder.DataSource.ToUpper();

connectionDatabaseComboBox.EditValue = builder.InitialCatalog.ToUpper();

if (builder.IntegratedSecurity)

connectionAuthenticationModeRadioGroup.EditValue = 0;

connectionUsernameTextEdit.Text = string.Empty;

connectionPasswordTextEdit.Text = string.Empty;

else

connectionAuthenticationModeRadioGroup.EditValue = 1;

connectionUsernameTextEdit.Text = builder.UserID;

connectionPasswordTextEdit.Text = builder.Password;

Es decir, creamos un SqlConnectionStringBuilder a partir de la primera


cadena de conexión del fichero de configuración y a partir de aquí, trabajamos
por separado con cada una de las partes de la cadena, accediendo a las
propiedades del builder (Datasource, InitialCatalog, IntegratedSecurity, etc.).
De este modo las mostramos en el form, o dónde queramos…

Guardando que es gerundio

La siguiente pregunta lógica es: ¿Y para guardar sólo uno de los valores en el
fichero de configuración? El típico ejemplo es modificar el nombre del servidor
al instalar en el cliente final. Para ello vamos a usar también un builder, y
vamos a ampliar la clase anterior con algunos métodos más. Para obtener los
valores de las propiedades de la cadena de conexión y para guardarlos:

Obtener valores de propiedades de la cadena de conexión:

public static string GetSqlServerServerName()

string cs = GetConnectionString(GetFirstConnectionStringName());

if (cs != null)

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(cs);

return builder.DataSource;

else

return null;

public static string GetSqlServerDatabaseName()

string cs = GetConnectionString(GetFirstConnectionStringName());

if (cs != null)

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(cs);

return builder.InitialCatalog;

else

return null;

public static string GetSqlServerUserName()

string cs = GetConnectionString(GetFirstConnectionStringName());

if (cs != null)

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(cs);

return builder.UserID;

else

return null;

public static string GetSqlServerPassword()

string cs = GetConnectionString(GetFirstConnectionStringName());

if (cs != null)

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(cs);

return builder.Password;

else

return null;

public static bool? GetSqlServerIntegratedSecurity()

string cs = GetConnectionString(GetFirstConnectionStringName());

if (cs != null)

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(cs);

return builder.IntegratedSecurity;

else

return null;

Guardar valores de propiedades en la cadena de conexión:

public static string SetConnectionStringServerName(

string connectionString, string serverName)

SqlConnectionStringBuilder builder =

new SqlConnectionStringBuilder(connectionString);

builder.DataSource = serverName;

return builder.ConnectionString;

public static string SetConnectionStringAutenticationIntegrated(

string connectionString)

SqlConnectionStringBuilder builder =

new SqlConnectionStringBuilder(connectionString);

builder.IntegratedSecurity = true;

return builder.ConnectionString;

public static string SetConnectionStringAutenticationSQLServer(

string connectionString, string username, string password)

SqlConnectionStringBuilder builder =

new SqlConnectionStringBuilder(connectionString);

builder.IntegratedSecurity = false;

builder.UserID = username;

builder.Password = password;

return builder.ConnectionString;

public static string SetConnectionStringDatabaseName(

string connectionString, string databaseName)

SqlConnectionStringBuilder builder =

new SqlConnectionStringBuilder(connectionString);

builder.InitialCatalog = databaseName;

return builder.ConnectionString;

Así pues, para cambiar el nombre del servidor en el app.config bastaría con:

Leer la cadena de conexión actual


Cambiar el nombre del server
Volver a guardar la cadena de conexión

string cs = ConnectionStringManager.GetFirstConnectionString();

string newConStr = ConnectionStringManager.SetConnectionStringServerName(cs, "MyNewServer");

ConnectionStringManager.SaveConnectionString(

ConnectionStringManager.GetFirstConnectionStringName(), newConStr);

Me han quedado bastantes cosas en el tintero (recuperar los servidores SQL


Server de nuestra red local, mostrar las bases de datos de un server, o crear
un formulario para el usuario final). Si hay tiempo y pensáis que es un tema de
interés lo veremos en futuros posts.

Nos vemos!

Comments

One Responseso far

Kiquenet dice:
24 octubre, 2011 a las 5:20 pm
Sería interesante ver ese diálogo de Sql Server

Respecto a cuadros de diálogos así, éstas son buenas referencias:

http://stackoverflow.com/questions/2205993/winforms-connection-
properties-dialog-for-configuration-string

Data Connection Dialog


http://archive.msdn.microsoft.com/Connection

Saludos

Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios


están marcados con *

Comentario

Nombre *

Correo electrónico *

Web

Publicar comentario

← Previous Post Next Post →

About This Site Archives Widget Categories Search

A cras tincidunt, ut tellus et. January 2010 Entertainment Search


Gravida scel ipsum sed December 2009 Technology
iaculis, nunc non nam. November 2009 Sports & Recreation
Placerat sed phase llus, purus October 2009 Jobs & Lifestyle
purus elit.

Powered by WordPress | Business Directory by InkThemes.

También podría gustarte