none
Actualizar base de datos access

    Pregunta

  • Hola, tengo el siguiente problema:

    estoy conectando VB a una base de datos de access mediante el siguiente codigo

       Try
                cnn.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Equipo\Documents\ASECAL.accdb;Persist Security Info=False")
                cnn.Open()
                Return True
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            End Try

    y estoy haciendo una actualización de registros mediante este codigo

        Try
                conectado()
                cmd.CommandText = "update Áreas set Área=@Área  where Id=@Id"
                cmd.CommandType = CommandType.TableDirect
                cmd.Connection = cnn
    
                cmd.Parameters.Add(New OleDb.OleDbParameter("@Id", dts.gID))
                cmd.Parameters.Add(New OleDb.OleDbParameter("@Área", dts.gAREA))
    
                If cmd.ExecuteNonQuery Then
                    Return True
                Else
                    Return False
                End If
    
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            Finally
                desconectado()
            End Try

    y un botón de actualizar con el siguiente codigo

    Dim result As DialogResult
    
            result = MessageBox.Show("¿Realmente desea editar los datos del Areá?", "Modificando Areá", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
    
            If result = DialogResult.OK Then
    
                Try
                    Dim dts As New varea
                    Dim func As New farea
    
                    dts.gID = id_txt.Text
                    dts.gAREA = area_txt.Text
    
                    If func.editar_area(dts) Then
                        MessageBox.Show("Areá modificada correctamente", "Modificando Areá", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        mostrar_areas()
                        btn_insertar.Enabled = True
                        btn_editar.Enabled = True
                        btn_grabar.Visible = True
                        btn_eliminar.Visible = True
                    Else
                        MessageBox.Show("Areá no fue modifcada intente de nuevo", "Modificando Areá", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        mostrar_areas()
                        btn_insertar.Enabled = True
                        btn_editar.Enabled = True
                        btn_grabar.Visible = True
                        btn_eliminar.Visible = True
                    End If
    
    end try 

    Pero al momento de presionar el boton me sale el error "No se puede abrir la consulta de acción"

    que puedo estar haciendo mal?

    de ante mano muchas gracias

    lunes, 6 de febrero de 2017 1:04

Respuestas

  • El_vena,

    ¿En realidad la función Conectado() es útil?, te recomiendo definir el ámbito de la instancia de la clase OleDbConnection mediante la instrucción using, sí que es útil tener una propiedad/campo que contenga la cadena de conexión para evitar escribirla por cada vez que se invoque al constructor de la clase OleDbConnection. Otro punto a tomar en cuenta es el tipo de comando que estableces, deberías elegir el tipo Text que por cierto es el valor predeterminado para la propiedad CommandType. Por otro lado, el método ExecuteNonQuery() retorna el número de filas afectadas por la operación y la expresión que intentas escribir no tiene sentido porque no comparas contra un valor. Finalmente, ¿tiene sentido implementar un manejador de errores dentro de la función cuando el control lo realizas nuevamente en la llamada a la función?

    Public Function editar_area(dts As varea) As Boolean
    
    	Using cn As New OleDbConnection("Cadena de conexión")
    		Dim cmd As New OleDbCommand("UPDATE Áreas SET Área = ? where Id = ?", cn)
    
    		cmd.Parameters.AddWithValue("@Área", dts.gAREA)
    		cmd.Parameters.AddWithValue("@Id", dts.gID)	
    
    		cn.Open()
    
    		Return cmd.ExecuteNonQuery() > 0
    	End Using
    
    End Function

    - Invocar a la función implementado un manejador de errores:

    If MessageBox.Show("¿Desea actualizar los datos?") = DialogResult.Yes Then
    	Try
    		Dim dts As New varea
    		Dim func As New farea
    
    		dts.gID = id_txt.Text
    		dts.gAREA = area_txt.Text
    
    		Dim Resultado As Boolean = func.editar_area(dts)
    
    		MessageBox.Show(IIf(Resultado, "Actualización realizada", "0 filas afectadas"))
    
    		mostrar_areas()
    
    		btn_insertar.Enabled = True
    		btn_editar.Enabled = True
    		btn_grabar.Visible = True
    		btn_eliminar.Visible = True
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 6 de febrero de 2017 2:06
  • Hola , el CommandType.TableDirect esta demás en lugar de eso deberías poner

    command.CommandType = CommandType.Text

    otra cosa a considerar es que Access no toma los parámetros por nombre sino por posición,en tu caso el primer parámetro en ,la query es @Area entonces debería ser algo como

    cmd.Parameters.AddWithValue("@Área", dts.gAREA)
    cmd.Parameters.AddWithValue("@Id", dts.gID)

    Quedo a la espera de tus comentarios.


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    lunes, 6 de febrero de 2017 2:08

Todas las respuestas

  • El_vena,

    ¿En realidad la función Conectado() es útil?, te recomiendo definir el ámbito de la instancia de la clase OleDbConnection mediante la instrucción using, sí que es útil tener una propiedad/campo que contenga la cadena de conexión para evitar escribirla por cada vez que se invoque al constructor de la clase OleDbConnection. Otro punto a tomar en cuenta es el tipo de comando que estableces, deberías elegir el tipo Text que por cierto es el valor predeterminado para la propiedad CommandType. Por otro lado, el método ExecuteNonQuery() retorna el número de filas afectadas por la operación y la expresión que intentas escribir no tiene sentido porque no comparas contra un valor. Finalmente, ¿tiene sentido implementar un manejador de errores dentro de la función cuando el control lo realizas nuevamente en la llamada a la función?

    Public Function editar_area(dts As varea) As Boolean
    
    	Using cn As New OleDbConnection("Cadena de conexión")
    		Dim cmd As New OleDbCommand("UPDATE Áreas SET Área = ? where Id = ?", cn)
    
    		cmd.Parameters.AddWithValue("@Área", dts.gAREA)
    		cmd.Parameters.AddWithValue("@Id", dts.gID)	
    
    		cn.Open()
    
    		Return cmd.ExecuteNonQuery() > 0
    	End Using
    
    End Function

    - Invocar a la función implementado un manejador de errores:

    If MessageBox.Show("¿Desea actualizar los datos?") = DialogResult.Yes Then
    	Try
    		Dim dts As New varea
    		Dim func As New farea
    
    		dts.gID = id_txt.Text
    		dts.gAREA = area_txt.Text
    
    		Dim Resultado As Boolean = func.editar_area(dts)
    
    		MessageBox.Show(IIf(Resultado, "Actualización realizada", "0 filas afectadas"))
    
    		mostrar_areas()
    
    		btn_insertar.Enabled = True
    		btn_editar.Enabled = True
    		btn_grabar.Visible = True
    		btn_eliminar.Visible = True
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 6 de febrero de 2017 2:06
  • Hola , el CommandType.TableDirect esta demás en lugar de eso deberías poner

    command.CommandType = CommandType.Text

    otra cosa a considerar es que Access no toma los parámetros por nombre sino por posición,en tu caso el primer parámetro en ,la query es @Area entonces debería ser algo como

    cmd.Parameters.AddWithValue("@Área", dts.gAREA)
    cmd.Parameters.AddWithValue("@Id", dts.gID)

    Quedo a la espera de tus comentarios.


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    lunes, 6 de febrero de 2017 2:08