none
Agregar una cadena de conexión a app.config

    Pregunta

  • Hola a todos:

    Estoy dándole vueltas al tema de poder agregar por código una nueva cadena de conexión al archivo App.Config y me está dando error (ya lo señalo) en la creación por código de la misma. El error es "Referencia a objeto no establecida com instancia de un objeto". Determine si el objeto es null antes de llamar al método.

    Bueno, lo que hago es leer si los nombres de las bases de datos que tengo, existen en el App.Config y después si no está, añado la cadena de conexión al App.Config.

    Me he inventado el nombre de una base de datos como prueba para ver la secuencia que hace el programa para crear dicha cadena de conexión y es ahí en la creación donde me falla. Creo que me falla porque la sentencia que tengo es para modificar, me falta añadirle que sea para crear, pero he buscado y no encuentro la forma.

    Os pongo el ejemplo y remarco la línea donde da el error citado. Primero leo las bases de datos que hay y si no, la intento agregar si no existe como está en el ejemplo.

    Private Shared Sub LeerCadenasDeConexion()
    
            'Leemos del archivo de configuración, las cadenas de conexión que tenemos.
            Dim settings As ConnectionStringSettingsCollection = ConfigurationManager.ConnectionStrings
            If Not settings Is Nothing Then
                For Each cs As ConnectionStringSettings In settings
    
                    NombreConexion = (cs.Name)
    
                    Select Case NombreConexion
                        Case "MiCadenaConexion"
                            ConexAccess = True
    
                        Case "PerseoSQLce"
                            ConexSqlCompact = True
    
                        Case "PerseoSqlEx"
                            ConexServerEx = True
    
                        Case "Pepito"
                            ConexPepito = True
                    End Select
    
                    Proveedor = (cs.ProviderName)
                    Conexion = (cs.ConnectionString)
                Next
            End If
    
            If ConexAccess = True Then
                MessageBox.Show("Existe Access")
            End If
    
            If ConexSqlCompact = True Then
                MessageBox.Show("Existe Compact")
            End If
    
            If ConexServerEx = True Then
                MessageBox.Show("Existe SqlServerEx")
            End If
    
            If ConexPepito = True Then
                MessageBox.Show("Existe Pepito")
            Else
                MessageBox.Show("No Existe Pepito")
    
                Dim config As System.Configuration.Configuration = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath)
    
                Dim connectionStringsSection As ConnectionStringsSection = DirectCast(config.GetSection("connectionStrings"), ConnectionStringsSection)
    
                Dim ValorDataSource As String = "|DataDirectory|"
    
                connectionStringsSection.ConnectionStrings("Pepito").ConnectionString = "Data Source= " & ValorDataSource & "\Pepito.sdf"
    
                config.Save(ConfigurationSaveMode.Full, False)
    
            End If
        End Sub

    Os pongo también como tengo el App.Config para las connectionsstrings.

     <!--'/////////////////  CONEXIONES BASE DE DATOS. ////////////////////-->
       <connectionStrings>
          <clear />
          <add name="MiCadenaConexion" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|\gemmafin.accdb"
             providerName="System.Data.OleDb" />
          <add name="PerseoSqlEx" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=PerseoSqlEx;Integrated Security=true"
             providerName="System.Data.SqlClient" />
          <add name="PerseoSQLce" connectionString="Data Source=|DataDirectory|\PerseoSqlCe.sdf"
             providerName="System.Data.SqlServerCe.4.0" />
       </connectionStrings>

    Le he puesto un nombre "rebuscado" a la base de datos inexistente "Pepito", pero bueno para el caso es lo mismo. Después ya borraré los messagebox, etc, esto es solo como prueba. Si indico que las otras 3 bases de datos existen en dicho archivo.

    Muchas gracias a todos.

    Gemma

    lunes, 28 de noviembre de 2016 18:37

Respuestas

  • "gemma_campillo" escribió:

    > Estoy dándole vueltas al tema de poder agregar por código una nueva cadena
    > de conexión al archivo App.Config y me está dando error (ya lo señalo) en
    > la creación por código de la misma. El error es "Referencia a objeto no
    > establecida com instancia de un objeto". Determine si el objeto es null
    > antes de llamar al método.

    Hola, Gemma:

    Me imagino que la NullReferenceException la obtendrás en la siguiente línea de código:

    connectionStringsSection.ConnectionStrings("Pepito").ConnectionString = ...

    Y es normal que obtengas esa excepción si en la colección de cadenas de conexión NO EXISTE un elemento llamado "Pepito". Si no existe el elemento, ¿cómo pretendes referenciarlo? Para referenciar el elemento mediante un índice (o en éste caso mediante su nombre), tendrá que existir previamente, con independencia que se trate de una cadena de conexión o del índice de cualquier otra colección diferente.

    Si tu intención es añadir al archivo de configuración de la aplicación en tiempo de ejecución una cadena de conexión con nombre llamada "Pepito", sustituye la línea anterior por éstas otras:

                Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath)
    
                Dim connectionStringsSection As ConnectionStringsSection = DirectCast(config.GetSection("connectionStrings"), ConnectionStringsSection)
    
                ' Creamos una nueva cadena de conexión.
                Dim s As New ConnectionStringSettings()
    
                ' Nombre de la cadena de conexión
                s.Name = "Pepito"
    
                ' Cadena de conexión propiamente dicha.
                s.ConnectionString = "Data Source=|DataDirectory|\Pepito.sdf"
    
                ' Nombre del proveedor de datos invariable
                s.ProviderName = "System.Data.SqlServerCe.4.0"
    
                ' Añadimos la nueva cadena de conexión al objeto ConnectionStringsSection.
                connectionStringsSection.ConnectionStrings.Add(s)
    
                ' Guardamos los cambios en el archivo de configuración de la aplicación.
                config.Save(ConfigurationSaveMode.Full, False)

    Y ahora sí podrías referenciar la cadena de conexión mediante el nombre "Pepito", porque ya existe en la colección:

        MessageBox.Show(connectionStringsSection.ConnectionStrings("Pepito").ConnectionString)

    Obviamente tendrás que reiniciar la aplicación para que la nueva cadena de conexión pueda ser leía por el objeto ConnectionStringSettingsCollection, es decir, cuando al comienzo del procedimiento ejecutas:

        Dim settings As ConnectionStringSettingsCollection = ConfigurationManager.ConnectionStrings

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 30 de noviembre de 2016 16:46
    Moderador

Todas las respuestas

  • Por lo que logro entender hiciste un "DataSet" para poder conectarte a la base de datos, y creo que lo estas editando en la ventana incorrecta, en la ventana de "Solution Explorer" se salen los "Forms" que pusiste en tu solución así como el nombre del proyecto, debajo del nombre del proyecto encontraras un icono como de una llavecita que dice "My project" dale doble click y te debe salir una ventana con varias opciones a tu izquierda en esas pociones te vas a "Settings" y ahí es donde vienen las cadenas de conexión, es ahí donde debes hacer los cambio por lo que entiendo lo estas buscando en "My Extension".
    lunes, 28 de noviembre de 2016 19:00
  • "gemma_campillo" escribió:

    > Estoy dándole vueltas al tema de poder agregar por código una nueva cadena
    > de conexión al archivo App.Config y me está dando error (ya lo señalo) en
    > la creación por código de la misma. El error es "Referencia a objeto no
    > establecida com instancia de un objeto". Determine si el objeto es null
    > antes de llamar al método.

    Hola, Gemma:

    Me imagino que la NullReferenceException la obtendrás en la siguiente línea de código:

    connectionStringsSection.ConnectionStrings("Pepito").ConnectionString = ...

    Y es normal que obtengas esa excepción si en la colección de cadenas de conexión NO EXISTE un elemento llamado "Pepito". Si no existe el elemento, ¿cómo pretendes referenciarlo? Para referenciar el elemento mediante un índice (o en éste caso mediante su nombre), tendrá que existir previamente, con independencia que se trate de una cadena de conexión o del índice de cualquier otra colección diferente.

    Si tu intención es añadir al archivo de configuración de la aplicación en tiempo de ejecución una cadena de conexión con nombre llamada "Pepito", sustituye la línea anterior por éstas otras:

                Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath)
    
                Dim connectionStringsSection As ConnectionStringsSection = DirectCast(config.GetSection("connectionStrings"), ConnectionStringsSection)
    
                ' Creamos una nueva cadena de conexión.
                Dim s As New ConnectionStringSettings()
    
                ' Nombre de la cadena de conexión
                s.Name = "Pepito"
    
                ' Cadena de conexión propiamente dicha.
                s.ConnectionString = "Data Source=|DataDirectory|\Pepito.sdf"
    
                ' Nombre del proveedor de datos invariable
                s.ProviderName = "System.Data.SqlServerCe.4.0"
    
                ' Añadimos la nueva cadena de conexión al objeto ConnectionStringsSection.
                connectionStringsSection.ConnectionStrings.Add(s)
    
                ' Guardamos los cambios en el archivo de configuración de la aplicación.
                config.Save(ConfigurationSaveMode.Full, False)

    Y ahora sí podrías referenciar la cadena de conexión mediante el nombre "Pepito", porque ya existe en la colección:

        MessageBox.Show(connectionStringsSection.ConnectionStrings("Pepito").ConnectionString)

    Obviamente tendrás que reiniciar la aplicación para que la nueva cadena de conexión pueda ser leía por el objeto ConnectionStringSettingsCollection, es decir, cuando al comienzo del procedimiento ejecutas:

        Dim settings As ConnectionStringSettingsCollection = ConfigurationManager.ConnectionStrings

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 30 de noviembre de 2016 16:46
    Moderador
  • Hola querido Enrique:;

    Siempre eres la solución.

    Me iba a poner mañana para dejarlo ya arreglado de la forma que te indico, ir probando y a ver que pasaba porque hoy ya me he cansado de leer la MSDN y google.

    Dim myConfiguration As Configuration = OpenExeConfiguration("FinancialSystem.exe")
    
                myConfiguration.ConnectionStrings.ConnectionStrings("PerseoSqlEx").ConnectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=PerseoSqlEx;Integrated Security=true"
    myConfiguration.Save()

    Pero quería probarlo a fondo a ver si lo solucionaba. Cuando no sabes por donde van los tiros que complicado es.

    Bueno, ya y como siempre me has dado la solución genio. Te doy las gracias otra vez mas porque siempre me sacas del apuro.

    Bueno maestro, me pongo con ello.

    Un fuerte abrazo como siempre de tu amiga.

    Gemma

    miércoles, 30 de noviembre de 2016 18:01