none
Error en apertura de conexion RRS feed

  • Pregunta

  • Hola a todos:

    Estoy teniendo problemas de apertura de conexión en el siguiente procedimiento que calcula el valor del "cmd" en otro procedimiento.

      Public Shared Sub Formula_ActivoTotal()
            ' Creamos el acceso a datos mediante el nombre de la cadena de conexión existente en el archivo de configuración de la aplicación.
            Dim da As DataAccessInvariant = DataAccessInvariant.GetDataAccessInvariant(Configuracion.CadenaConexion)
    
            Dim valor As Integer = AccesoLogica.ObtenerPeriodos()
    
            ' Declaramos una variable Connection
            Using cnn As DbConnection = da.CreateConnection()
    
                ' Creamos el Commando
                Dim cmd As DbCommand = cnn.CreateCommand()
    
                cnn.Open()
    
                ReDim ActivoTotal(ActivoTotal.Length - 1)
    
                If VarGlobal.StrCodPais = "34" Then
                    Select Case VarGlobal.StrPlanConta
                        Case "PLAN 2007"
    
                            'Accedemos al stored procedure o bien a la fórmula del mismo según tipo de Base de datos.
                            cmd = MetodosCreacion.NombreProcFormulas("CreacionprocFormulasBalance_5_ClaveMP")
    
                            With cmd.Parameters
                                .Clear()
                                .Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))
                                .Add(Configuracion.CreateParameter(cmd, "@planconta", "PLAN 2007"))
                                .Add(Configuracion.CreateParameter(cmd, "@codigo1", "A2"))
                                .Add(Configuracion.CreateParameter(cmd, "@codigo2", "A3"))
                                .Add(Configuracion.CreateParameter(cmd, "@codigo3", "A4"))
                                .Add(Configuracion.CreateParameter(cmd, "@codigo4", "A4I"))
                                .Add(Configuracion.CreateParameter(cmd, "@codigo5", "A5"))
                            End With
    
                            Using dr As DbDataReader = cmd.ExecuteReader()
                                While dr.Read()
                                    For i = 0 To valor
                                        ActivoTotal(i) += dr.GetDouble(i)
                                    Next
                                End While
                            End Using
                    End Select
                End If
            End Using
        End Sub

    Cuando pasa por el DbDataReader salta la excepción:

    Información adicional: ExecuteReader: no se ha inicializado la propiedad Connection.

    Si vuelvo a poner el Cnn.Open entonces indica que la conexión ya está abierta. No se que es lo que me falta. Quizás el error me viene de la asignación que le hago al cmd: MetodosCreacion.NombreProcFormulas("CreacionprocFormulasBalance_5_ClaveMP"), pero es la única forma que veo en la que el cmd lleva la información que preciso.

    Un cordial saludo a todos.

    Gemma

    domingo, 14 de febrero de 2016 6:22

Respuestas

  • "gemma_campillo" escribió:

    > Estoy teniendo problemas de apertura de conexión en el siguiente procedimiento
    > que calcula el valor del "cmd" en otro procedimiento.
    >
    > Cuando pasa por el DbDataReader salta la excepción:
    >
    > Información adicional: ExecuteReader: no se ha inicializado la propiedad Connection.
    >
    > Si vuelvo a poner el Cnn.Open entonces indica que la conexión ya está abierta.
    >

    Buenos días, Gemma:

    Fíjate lo que estás haciendo. Por un lado estás creando un objeto DbCommand:

       ' Creamos el Commando
       Dim cmd As DbCommand = cnn.CreateCommand()

    Y posteriormente, sobrescribes el comando creado con aquel devuelto por la función MetodosCreacion.NombreProcFormulas:

       'Accedemos al stored procedure o bien a la fórmula del mismo según tipo de Base de datos.
       cmd = MetodosCreacion.NombreProcFormulas("CreacionprocFormulasBalance_5_ClaveMP")

    Son dos comandos diferentes. ¿Con cual prefieres quedarte? ¿Con el primero o con el segundo? Si es con el segundo, NO LLAMES al método cnn.CreateCommand:

       ' Declaramos una variable objeto del tipo DbCommand
       Dim cmd As DbCommand = Nothing
    
       'Accedemos al stored procedure o bien a la fórmula del mismo según tipo de Base de datos.
       cmd = MetodosCreacion.NombreProcFormulas("CreacionprocFormulasBalance_5_ClaveMP")

    Y vuelvo a escribir lo que te indiqué ayer respecto del valor devuelto por la función NombreProcFormulas:

    [...] Por último te comento que observes bien que el objeto DbCommand devuelto por la función NombreProcFormulas, NO tiene asignado una conexión válida, es decir, el valor de su propiedad Connection es Nothing. Te quiero decir con esto que, ANTES de ejecutar el comando propiamente dicho, tendrás que asignarle el objeto DbConnection adecuado al tipo de base de datos que estés utilizando. ¿Me explico? ;-) [...]

    Lo que quiere decir que en el procedimiento Formula_ActivoTotal() tendrás que asignarle un objeto DbConnection al comando devuelto por la función NombreProcFormulas. Antes de llamar al método ExecuteReader, asegúrate de ejecutar las siguientes líneas:

        ' Asignamos la conexión al comando
        cmd.Connection = cnn
    
        ' Abrimos la conexión
        cnn.Open()
    
        ' Abrimos el lector
        Using dr As DbDataReader = cmd.ExecuteReader()

    Que pases un feliz domingo de San Valentín. ¿O de "factorías"? :-))


    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.


    domingo, 14 de febrero de 2016 7:09
    Moderador

Todas las respuestas

  • "gemma_campillo" escribió:

    > Estoy teniendo problemas de apertura de conexión en el siguiente procedimiento
    > que calcula el valor del "cmd" en otro procedimiento.
    >
    > Cuando pasa por el DbDataReader salta la excepción:
    >
    > Información adicional: ExecuteReader: no se ha inicializado la propiedad Connection.
    >
    > Si vuelvo a poner el Cnn.Open entonces indica que la conexión ya está abierta.
    >

    Buenos días, Gemma:

    Fíjate lo que estás haciendo. Por un lado estás creando un objeto DbCommand:

       ' Creamos el Commando
       Dim cmd As DbCommand = cnn.CreateCommand()

    Y posteriormente, sobrescribes el comando creado con aquel devuelto por la función MetodosCreacion.NombreProcFormulas:

       'Accedemos al stored procedure o bien a la fórmula del mismo según tipo de Base de datos.
       cmd = MetodosCreacion.NombreProcFormulas("CreacionprocFormulasBalance_5_ClaveMP")

    Son dos comandos diferentes. ¿Con cual prefieres quedarte? ¿Con el primero o con el segundo? Si es con el segundo, NO LLAMES al método cnn.CreateCommand:

       ' Declaramos una variable objeto del tipo DbCommand
       Dim cmd As DbCommand = Nothing
    
       'Accedemos al stored procedure o bien a la fórmula del mismo según tipo de Base de datos.
       cmd = MetodosCreacion.NombreProcFormulas("CreacionprocFormulasBalance_5_ClaveMP")

    Y vuelvo a escribir lo que te indiqué ayer respecto del valor devuelto por la función NombreProcFormulas:

    [...] Por último te comento que observes bien que el objeto DbCommand devuelto por la función NombreProcFormulas, NO tiene asignado una conexión válida, es decir, el valor de su propiedad Connection es Nothing. Te quiero decir con esto que, ANTES de ejecutar el comando propiamente dicho, tendrás que asignarle el objeto DbConnection adecuado al tipo de base de datos que estés utilizando. ¿Me explico? ;-) [...]

    Lo que quiere decir que en el procedimiento Formula_ActivoTotal() tendrás que asignarle un objeto DbConnection al comando devuelto por la función NombreProcFormulas. Antes de llamar al método ExecuteReader, asegúrate de ejecutar las siguientes líneas:

        ' Asignamos la conexión al comando
        cmd.Connection = cnn
    
        ' Abrimos la conexión
        cnn.Open()
    
        ' Abrimos el lector
        Using dr As DbDataReader = cmd.ExecuteReader()

    Que pases un feliz domingo de San Valentín. ¿O de "factorías"? :-))


    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.


    domingo, 14 de febrero de 2016 7:09
    Moderador
  • Buenos días querido maestro:

    Ahora lo he acabado de entender, tu sabes que soy bastante burra y a veces no veo lo que tengo delante. Y eso me pasa por que quiero correr más de lo que se y a veces no me paro a pensar lo que tengo que hacer y otro problema que pasa es que cuando tu respondes es como si estuviueras aquí conmigo, ¿que quiere decir eso?, pues que simplemente me limito a copiar y a pegar lo que me indicas, palabra de "Dios". Se que me he acostumbrado mal o bien tu me has acostumbrado mal, porque me lo das hecho y eso me facilita enormemente las cosas. Bueno, sea lo que sea, bienvenido.

    Nada más decirte que tu también pases un feliz día de "San Valentín", que descanses si puedes y que disfrutes con los tuyos de este día que hoy por fin ha salido el sol aquí en Barcelona y espero que en Jaén también.

    Enrique muchas gracias querido y gran amigo y maestro.

    Un fuerte abrazo.

    Gemma

    domingo, 14 de febrero de 2016 7:33