none
Error constante "The Connection is alredy Open." RRS feed

  • Pregunta

  • Estimados, tengo casi lista una aplicación que se conecta a una base de datos mysql, la aplicación actualiza registros uno por uno, primero me conecto a SQL Server, cargo los datos en grilla, recorre la fila 1 de mi grilla y actualiza los campos necesarios en mi base de datos de mysql en otro lado, el problema es que al saltar al segundo registro y todos los que siguen siempre me arroja el error (The connection is alredy open). no entiendo por que sucede, he realizado y probe varios cambios en mi código pero no entiendo, abro y cierro la conexión pero el problema persiste. dejo una parte de mi codigo acá

     Private Sub actualizaprecio()
            Try
                conexion.Open()
                Dim actualizar As String
                actualizar = "Update product Set precio='" & TxtPrecioBase.Text & "' WHERE id_product='" & TxtIDBase.Text & "'"
                Comando = New MySqlCommand(actualizar, conexion)
                Comando.ExecuteNonQuery()
                'MsgBox("registro actualizado en precio")
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                conexion.Close()
            End Try
            
        End Sub
    por que sucede esto? 

     
    domingo, 5 de junio de 2016 21:49

Respuestas

  • Miguel Oyarzo,

    En tanto insistas en omitir las practicas que te recomiendo sólo obtendrás problemas.

    No es correcto que declares e instancies un objeto de tipo MySqlConnection en un ámbito de clase porque pierdes el control -tal como te viene sucediendo-, por segunda vez te sugiero que limites el ámbito con la instrucción using.

    A ver, concéntrate en el método grabaweb

    Private Sub grabaweb()
            If TxtPrecioBase.Text.Contains("0,00") Then
                Try
                    conexion.Open()
                    actualizastock()
                    CargarGrilla()


    Fíjate, abres la conexión e invocas al método actualizastock()

    Private Sub actualizastock()
            Try
                conexion.Open()
                Dim actualizar As String


    El método actualizastock() vuelve a intentar abrir la misma conexión, pero la conexión ya está abierta, ¿te das cuenta que eso es incorrecto?

    La recomendación ya la sabes, pero si insistes en trabajar de manera no correcta entonces no abras una conexión si sabes que la rutina a la que llamas intentará abrir la conexión.

    Private Sub grabaweb() If TxtPrecioBase.Text.Contains("0,00") Then Try conexion.Open() ---->No abras la conexión porque los métodos a los que llamas abren la conexión actualizastock() CargarGrilla()

    Fíjate que no tengas casos similares en otras llamadas



    • Editado Willams Morales lunes, 6 de junio de 2016 0:19
    • Propuesto como respuesta Sergio Parra lunes, 6 de junio de 2016 4:22
    • Marcado como respuesta Miguel Oyarzo lunes, 6 de junio de 2016 13:20
    • Desmarcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 0:33
    • Marcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 4:44
    lunes, 6 de junio de 2016 0:13
  • Miguel Oyarzo,

    Fíjate en lo siguiente:

    Private Sub productoactivo()
            Using cn As New MySqlConnection("string de conexion a mi bd")
                cn.Open()
                Dim actualizar As String
                actualizar = "Update ps_product_shop Set active='" & TxtActivo.Text & "' WHERE price >='1'"
                Comando = New MySqlCommand(actualizar, conexion)
                Comando.ExecuteNonQuery()
                
            End Using
        End Sub

    Estas pasando una conexión equivocada, deberías pasar el objeto cn

    Comando = New MySqlCommand(actualizar, cn)

    Realiza los cambios en los demás métodos que presentan el mismo problema.

    • Propuesto como respuesta Sergio Parra lunes, 6 de junio de 2016 4:22
    • Marcado como respuesta Miguel Oyarzo lunes, 6 de junio de 2016 13:20
    • Desmarcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 0:33
    • Marcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 4:44
    lunes, 6 de junio de 2016 2:29

Todas las respuestas

  • Miguel Oyarzo,

    Sin duda alguna, existe una conexión abierta en alguna parte de su código, puede evitar la excepción validando que la conexión esté cerrada antes de intentar abrirla.

    If conexion.State = ConnectionState.Closed Then
    	cn.Open()
    End If

    Pero, lo correcto es que tenga controlado el ámbito de una conexión y para ello puede hacer uso de la instrucción using. 

    Try
            Using cn As New MySqlConnection(CADENA_CONEXION)
                    cn.Open()
    
    	        Dim consultaSql As String = "UPDATE product SET precio = @precio WHERE id_product = @id"
    
    	        Dim cmd As New MySqlCommand(consultaSql, cn)
    
    	        cmd.Parameters.AddWithValue("?precio", TxtPrecioBase.Text)
    	        cmd.Parameters.AddWithValue("?id", TxtIDBase.Text)
    
    	        cmd.ExecuteNonQuery()
    	End Using
    Catch e As exception
    	MsgBox(ex.Message)
    End Try


    • Propuesto como respuesta Sergio Parra lunes, 6 de junio de 2016 4:23
    domingo, 5 de junio de 2016 22:42
  • Miguel Oyarzo,

    ¿Puso a prueba lo que le comente? ¿Sigue teniendo problemas?

    domingo, 5 de junio de 2016 23:13
  • he probado pero no me funciona como debe ser o como debería ser correctamente.

    lo que deje arriba fue mi código del programa completo, lo que no entiendo es donde esta abierta la conexión, por mas que reviso mi código no veo que en ninguna parte tenga abierta la la conexión a la base de datos mysql.

    domingo, 5 de junio de 2016 23:28
  • Miguel Oyarzo,

    En tanto insistas en omitir las practicas que te recomiendo sólo obtendrás problemas.

    No es correcto que declares e instancies un objeto de tipo MySqlConnection en un ámbito de clase porque pierdes el control -tal como te viene sucediendo-, por segunda vez te sugiero que limites el ámbito con la instrucción using.

    A ver, concéntrate en el método grabaweb

    Private Sub grabaweb()
            If TxtPrecioBase.Text.Contains("0,00") Then
                Try
                    conexion.Open()
                    actualizastock()
                    CargarGrilla()


    Fíjate, abres la conexión e invocas al método actualizastock()

    Private Sub actualizastock()
            Try
                conexion.Open()
                Dim actualizar As String


    El método actualizastock() vuelve a intentar abrir la misma conexión, pero la conexión ya está abierta, ¿te das cuenta que eso es incorrecto?

    La recomendación ya la sabes, pero si insistes en trabajar de manera no correcta entonces no abras una conexión si sabes que la rutina a la que llamas intentará abrir la conexión.

    Private Sub grabaweb() If TxtPrecioBase.Text.Contains("0,00") Then Try conexion.Open() ---->No abras la conexión porque los métodos a los que llamas abren la conexión actualizastock() CargarGrilla()

    Fíjate que no tengas casos similares en otras llamadas



    • Editado Willams Morales lunes, 6 de junio de 2016 0:19
    • Propuesto como respuesta Sergio Parra lunes, 6 de junio de 2016 4:22
    • Marcado como respuesta Miguel Oyarzo lunes, 6 de junio de 2016 13:20
    • Desmarcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 0:33
    • Marcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 4:44
    lunes, 6 de junio de 2016 0:13
  • En realidad busco hacer lo correcto con la aplicación me enrede en realidad con el orden pero como es la primera vez que trabajo con mysql en visual studio, usare el Using para que lleve un orden correcto en lo que voy haciendo paso a paso.

    te cuento que tal me resulta Williams


    lunes, 6 de junio de 2016 1:30
  • Estimado hice estos cambios, dejando los demás de la misma forma para que hagan la actualización.

    pero ahora me sale el mensaje: connection must be valid and open.
    este es el código de como lo tengo ahora, te menciono que si le quito el try catch a grabarweb definitivamente no hace nada.

     Private Sub productoactivo()
            Using cn As New MySqlConnection("string de conexion a mi bd")
                cn.Open()
                Dim actualizar As String
                actualizar = "Update ps_product_shop Set active='" & TxtActivo.Text & "' WHERE price >='1'"
                Comando = New MySqlCommand(actualizar, conexion)
                Comando.ExecuteNonQuery()
                
            End Using
        End Sub
    
        Private Sub grabaweb()
            If TxtPrecioBase.Text.Contains("0,00") Then
                Try
                    actualizastock()
                    CargarGrilla()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                Try
                    actualizaprecio()
                    actualizapreciotienda()
                    actualizastock()
                    productoactivo()
                    'MsgBox(" la wea")
                    CargarGrilla()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
            VerEstadoNavegacion()
        End Sub

    lunes, 6 de junio de 2016 1:47
  • Miguel Oyarzo,

    ¿Podrías adjuntar nuevamente todo tu código?

    lunes, 6 de junio de 2016 1:56
  • Miguel Oyarzo,

    Fíjate en lo siguiente:

    Private Sub productoactivo()
            Using cn As New MySqlConnection("string de conexion a mi bd")
                cn.Open()
                Dim actualizar As String
                actualizar = "Update ps_product_shop Set active='" & TxtActivo.Text & "' WHERE price >='1'"
                Comando = New MySqlCommand(actualizar, conexion)
                Comando.ExecuteNonQuery()
                
            End Using
        End Sub

    Estas pasando una conexión equivocada, deberías pasar el objeto cn

    Comando = New MySqlCommand(actualizar, cn)

    Realiza los cambios en los demás métodos que presentan el mismo problema.

    • Propuesto como respuesta Sergio Parra lunes, 6 de junio de 2016 4:22
    • Marcado como respuesta Miguel Oyarzo lunes, 6 de junio de 2016 13:20
    • Desmarcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 0:33
    • Marcado como respuesta Miguel Oyarzo martes, 7 de junio de 2016 4:44
    lunes, 6 de junio de 2016 2:29
  • amigo me funciona casi perfecto como lo necesito

    El único detalle es que se muestra así, y debería mostrarse como se ve en la segunda imagen, donde veo lo que hay en la base de datos mysql, así como ir rellenándose los textbox, cosa que no sucede, es como si la navegación fuera ultra ultra veloz. como podre resolver eso estimado?

    Así es como debería de mostrarse cada salto de linea o carga de nuevos datos de os productos.


    • Editado Miguel Oyarzo lunes, 6 de junio de 2016 20:21 falta de texto
    lunes, 6 de junio de 2016 20:20
  • tengo este detalle en mi aplicación estimado! por que sucederá eso?
    martes, 7 de junio de 2016 0:34
  • Miguel Oyarzo,

    ¿En qué momento obtienes el problema? ¿Al cargar el formulario? ¿Al seleccionar una fila?. Si es al momento de cargar el formulario es posible que ese "delay" que obtienes en el redibujado de la pantalla se deba a que los procesos de carga del DGV tengan ocupado al CPU al punto de esperar que finalicen para continuar con el repintado, si ese es el caso hay mucha información para trabajar procesos en segundo plano o lo más simple es que la carga lo realices posterior a la acción del usuario de presionar un botón de buscar o algo parecido. Si el problema es al momento de seleccionar una fila entonces algo haces mal, habría que ver que instrucciones tienes en el evento SelectionChange() del objeto DataGridView()

    Por otro lado, no creo que haya sido necesario desmarcar las respuestas de este hilo, si tienes un nuevo caso es mejor que abras un nuevo hilo mencionando los pormenores que tienes dejando el hilo actual cerrado.

    martes, 7 de junio de 2016 3:26
  • Entiendo amigo, disculpa pensé que al mantenerla por un momento en deshabilitada podría significar que revisaran la ultima respuesta de mi parte. 

    por otro lado pensé en no abrir otro hilo para que no tenga que volver a dar toda la explicación, pero si lo consideras necesario lo abro.

    llendo a lo que me mencionas tengo este evento cargado:

    Private Sub TxtIDBase_TextChanged(sender As Object, e As EventArgs) Handles TxtIDBase.TextChanged
            mostrardatos()
            cargaproductosweb()
        End Sub

    lo que me doy cuenta que cuando le pongo esos messagebox.show me muestra ambas grillas y textbox cargados, es como si alli funcionara, sin embargo si los quito se muestra como la primera imagen que mostre mas arriba, indicando este problema de mostrar los textbox cargados y las grillas.

     Private Sub grabaweb()
            If TxtPrecioBase.Text.Contains("0,00") Then
                actualizastock()
                MessageBox.Show("actualizo stock")
                CargarGrilla()
            Else
    
                actualizaprecio()
                actualizapreciotienda()
                actualizastock()
                productoactivo()
                MsgBox(" la wea")
                CargarGrilla()
            End If
            VerEstadoNavegacion()
        End Sub


    • Editado Miguel Oyarzo martes, 7 de junio de 2016 6:03 corrección de detalles
    martes, 7 de junio de 2016 6:01