La Villa Digital: "El software es como el sexo: mejor si es libre y gratis" Linus Torvalds

A vueltas con .NET: Modificar Connection Strings en Runtime

Esto del .NET me parece alucinante, la de cosas que se pueden llegar a hacer de forma rápida y sencilla es enorme. Sin hablar de la cantidad ingente de ejemplos y ayuda que podemos encontrar por Internet. Sin embargo, me he encontrado con un problema.

En una aplicación que estoy haciendo necesito poder leer los datos de diferentes bases de datos en función del dominio en el que se ha autentificado el usuario. Las bases de datos corresponden a diferentes fábricas alrededor del mundo así que necesito poder cambiar el ConnectionString que utilizan los DataSets en tiempo de ejecución.  Después de indagar ésto es lo que he conseguido, espero que alguien le ayude.

Lo primero que debemos hacer es declarar los diferentes ConnectionString que podemos utilizar, en nuestro caso lo haremos dentro de  My Project -> Settings.

mysettings

En mi caso tengo 3 Connection Strings, uno de ellos (ConnectionString) es el que utilizan los diferentes DataSets y los otros dos (SpainConnectionString y ChinaConnectionString) son los diferentes valores que puede tomar la primera variable. En la misma pantalla de Settings le damos a ViewCode y saltaremos al código de la clase Settings  que nos permite utilizar eventos específicos de esa clase.


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
Public WriteOnly Property ChangeConnectionString() As String
Set(ByVal Value As String)
My.Settings("ConnectionString") = Value
End Set
End Property
End Class
End Namespace

Éste es el código que modifica el valor de la variable ConnectionString (también se puede utilizar para cambiar culaquier valor de la clase My Setting), ahora debemos llamar a éste proceso con el valor que nos interese.

En nuestro caso miramos el dominio del usuario y el rango de IP’s del usuario.

Private Sub GetDomain(ByVal HostName As String)
'Buscamos el dominio al que corresponde la ip que tenemos asignada,
'no el dominio al que nos hemos
'logueado desde Windows
Dim Direcciones As IPAddress() = Dns.GetHostAddresses(HostName)
'Recorremos todos los posibles dominios y cargamos el portal del dominio correspondiente
Select Case Mid(Mid(Direcciones(0).ToString(), 9), 1, InStr(Mid(Direcciones(0).ToString(), 9), ".") - 1)
Case My.Settings.SPAIN_IP
My.Settings.ChangeConnectionString = My.Settings.SPAINConnectionString
Case My.Settings.CHINA_IP
My.Settings.ChangeConnectionString = My.Settings.CHINAConnectionString
Case Else
'Si llegamos aqui es que no estamos en ningun dominio conocido, por tanto cerramos el portal
End Select
End Sub

Espero que os sea de ayuda.

Related posts:

  1. A vueltas con .NET: ComboBox Multi-Columna Aunque parezca mentira Visual Basic 2008 no incorpora por defecto...
  2. A vueltas con .NET: Minimizar formulario en la barra de tareas Desde hace algún algo más de un mes estoy aprendiendo...

Related posts brought to you by Yet Another Related Posts Plugin.

  • Estimado

    Me parece interesante el aporte que has entregado, pero llegue a Tu Artículo por lo siguiente:

    Es sabido que generar el instalador de un proyecto por medio de ClickOnce, la solución queda alojada en el directorio del Usuario (C:\Documents and Settings\MyUser\Configuración local\Apps\2.0\…), lo cual no genera ningún problema para el caso de Arquitectura Cliente Servidor simple, pero el caso que estoy resolviendo me es necesario generar un instalador que se aloje en un directorio particular como cualquier otra aplicacion (C:\Archivos de programa\MySystem), y que cualquier actualización del sistema quede en este mismo lugar (cosa que aun no se como haré).

    Te comento, dejando esto de lado por un momento, ahondé en el caso del ClickOnce y revisé como se alojaba el instalador en las carpetas del usuario, me encontré con la sorpresa de que las claves de acceso a las BD pueden ser leídas con cualquier editor de texto ya que en mi proyecto estan alojadas en el archivo “app.config” y que es el archivo que almacena las variables de conexion “” y de setting “”, bueno, pensando que nunca serían visibles, el caso es que si las agrego por medio del ejemplo mostrado por ti, también es posible leerlas, ya que estas y las claves anteriores quedan en el archivo “MySystem.exe.config” del directorio de la aplicacion.

    Mi consulta va por la siguiente idea que tengo; dejar estas claves encriptadas en “” del “app.config”, eso es simple, el detalle es como desencriptarlas en ejecucion y dejarlas en esta misma variable de sistema ya que esta es pasada a la fucion que genera la conexion a la BD.

    Con respeto a primer parrafo, si es posible aportarme alguna idea, tambien te lo agradceria.

    Espero tus comentarios.

    Ronny Morales M.

  • Hola Ronny,

    Primero de todo gracias por haber llegado hasta aqui, espero poder servirte de ayuda.

    Sobre el primer punto y hasta dondo sé, no es posible cambiar el directorio de instalación de una aplicación con ClickOnce. Si deseas utilizar otra ruta lo que puedes hacer es crear un proyecto de instalación y asociarlo cno tu aplicación.

    Tendrías que añadir código a tu aplicación para que se actualize desde la ruta que tu desees pero seguirá instalada en la misma ruta.

    Sobre el tema de las contraseñas de la base de datos en mi caso utilizo SQL que hereda los permisos de Windows, de esa manera no es necesario añadir las contraseñas al proyecto. Una aplicación que he realizado hace poco utiliza esta manera de conexión y no ha dado problema a ningún usuario.

    Espero haberte ayudado :)

    Saludos.

  • Tengo que hacer lo mismo con visual estudio 2008 donde tengo un origen de datos y debo cambiar el catalog cada año por otro voy que voy generando en otro conection string,es decir

    Nombre de conexión: 2009

    Data Source=SERVIDOR\SQLEXPRESS;Initial Catalog=2009;

    El año que viene tendre la conexión 2009 y 2010 como puedeo hacer para que la conexión del 2009 aquiera el valor del catalog = 2010

  • Ante todo gracias

  • Muy bueno el post y me ayudo un monton. La ventaja es que no se tiene que modificar el codigo del .designer.cs que es lo que yo hacia antes. Cada vez que modificaba con el editor, tenia que volver a modificar el codigo.
    Poste esto en ingles que hay mucha gente tiene el mismo problema.

You can follow any responses to this entry through the RSS 2.0 feed.

Trackbacks / Pingbacks