none
boton modificar base de datos access desde visual studio 2008 RRS feed

  • Pregunta

  • Buenos días, mi consulta es la siguiente, estoy haciendo un programa en el que tengo que modificar una BD desde visual studio 2008, el problema es que no logro encontrar el error que no permite actualizar los datos de la base, si me pueden ayudar se agradecerá, el código que estoy utilizando es el siguiente, perdón por lo extenso, pero es mi costumbre hasta no finalizar la prueba de funcionalidad, no crear el modulo para sintetizar el código.


    Public Class Form34

        Dim ruta As String
        Dim conexion As New OleDb.OleDbConnection
        Dim comando As New OleDb.OleDbCommand
        Dim adapter As New OleDb.OleDbDataAdapter
        Dim midataset As New DataSet
        Dim oledbread As OleDb.OleDbDataReader

        Dim a As String


        Private Sub Form34_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            ruta = Application.StartupPath & "\Biomedica.mdb"
            conexion.ConnectionString = "provider = microsoft.jet.oledb.4.0;data source=" & ruta
            conexion.Open()
            comando.Connection = conexion
            adapter.SelectCommand = comando
            adapter.SelectCommand.CommandText = "select * from Pedidos"

            MsgBox("Conexion Exitosa", vbInformation, "conectado")


            Button4.Visible = False

        End Sub


        Private Sub carga()

            midataset.Clear()
            adapter.SelectCommand.CommandText = "select * from Pedidos where Expediente = '" & TextBox1.Text & "'"
            adapter.Fill(midataset, "Pedidos")
            DataGridView1.DataSource = midataset
            DataGridView1.DataMember = "Pedidos"


        End Sub


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Call carga()

            TextBox1.Clear()

            Button3.Enabled = True


        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            Me.Hide()
            Form2.Show()

        End Sub



        Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

            Dim i As Integer = DataGridView1.CurrentRow.Index

            TextBox2.Text = DataGridView1(0, i).Value
            TextBox3.Text = DataGridView1(1, i).Value
            TextBox4.Text = DataGridView1(2, i).Value
            TextBox5.Text = DataGridView1(3, i).Value
            TextBox6.Text = DataGridView1(4, i).Value
            TextBox7.Text = DataGridView1(5, i).Value
            TextBox8.Text = DataGridView1(6, i).Value
            TextBox9.Text = DataGridView1(7, i).Value
            TextBox10.Text = DataGridView1(8, i).Value
            TextBox11.Text = DataGridView1(9, i).Value
            TextBox12.Text = DataGridView1(10, i).Value

        End Sub

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

            DataGridView1.Item(0, DataGridView1.CurrentRow.Index).Value = TextBox2.Text
            DataGridView1.Item(1, DataGridView1.CurrentRow.Index).Value = TextBox3.Text
            DataGridView1.Item(2, DataGridView1.CurrentRow.Index).Value = TextBox4.Text
            DataGridView1.Item(3, DataGridView1.CurrentRow.Index).Value = TextBox5.Text
            DataGridView1.Item(4, DataGridView1.CurrentRow.Index).Value = TextBox6.Text
            DataGridView1.Item(5, DataGridView1.CurrentRow.Index).Value = TextBox7.Text
            DataGridView1.Item(6, DataGridView1.CurrentRow.Index).Value = TextBox8.Text
            DataGridView1.Item(7, DataGridView1.CurrentRow.Index).Value = TextBox9.Text
            DataGridView1.Item(8, DataGridView1.CurrentRow.Index).Value = TextBox10.Text
            DataGridView1.Item(9, DataGridView1.CurrentRow.Index).Value = TextBox11.Text
            DataGridView1.Item(10, DataGridView1.CurrentRow.Index).Value = TextBox12.Text

            Button3.Visible = False
            Button4.Visible = True
            Button4.Enabled = True

        End Sub

       

    (ESTE ES EL BOTON QUE NO LOGRO HACER QUE FUNCIONE CORRECTAMENTE)    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

            Dim actualizar As String



            Try

               actualizar = "UPDATE Pedidos set Expediente = " & TextBox8.Text & ", Servicio = '" & TextBox2.Text & "', Fecha = '" & TextBox3.Text & "', Solicitud = '" & TextBox4.Text & "', Tipo de pedido= '" & TextBox5.Text & "', Nota = '" & TextBox6.Text & "', Carpeta = '" & TextBox7.Text & "', Cargado a GDE = '" & TextBox9.Text & "', OC = '" & TextBox10.Text & "', Proveedor = '" & TextBox11.Text & "', Estado = '" & TextBox12.Text & "' where Expediente = " & TextBox1.Text & " "



                comando = New OleDb.OleDbCommand(actualizar, conexion)
                comando.ExecuteNonQuery()
                MsgBox("El Registro ha sido actualizado con exito", vbInformation, "Actualizado")

            Catch ex As Exception

                MsgBox("Ha ocurrido un error, registro no actualizado", vbExclamation, "Error")

            End Try


            Button4.Visible = False
            Button3.Visible = True

            Button4.Enabled = False
            Button3.Enabled = False

            Call LimpiarTextBox(Me)

        End Sub

        Public Sub LimpiarTextBox(ByVal frm As Form)
            ' recorre todos los controles que hay en el formulario
            For Each Control In frm.Controls
                ' verifica que el control es de tipo TextBox
                If TypeOf Control Is TextBox Then
                    '... Si es un Textbox, entonces lo limpia
                    Control.Text = ""
                End If
            Next

        End Sub


    End Class



    • Editado shereckann jueves, 7 de enero de 2021 17:50
    jueves, 7 de enero de 2021 17:45

Respuestas

Todas las respuestas

  • Sería de mucha ayuda ver el mensaje exacto de error.

    Fíjate que los errores los estás interceptando con try... catch y que en el Catch solo muestras un mensaje genérico sin decir cuál es el error. Pero no importa, si pones un punto de ruptura y examinas la excepción con el debugger puedes ver cuál es el error aunque no lo muestres en pantalla.

    Lo más común es que los errores en estos casos se deban a una consulta SQL mal formada. Pero el error puede no ser visible a simple vista, porque podría (por ejemplo) deberse a un tipo de dato diferente. Normalmente, leyendo el texto completo de la excepción, estas cosas se hacen evidentes.

    Por cierto, veo que en el Select el Expediente lo has puesto entre comillas pero en el Update no. En qué quedamos, ¿es de tipo carácter o de tipo numérico? Hay una inconsistencia aquí. Si es de tipo carácter, ese sería un motivo para que el Update no funcione.

    Y no te digo nada acerca de los problemas que ocasiona escribir una sentencia SQL de esa manera (concatenando en lugar de parametrizando) porque ya se han vertido ríos de tinta acerca de ello y se ha explicado en cientos de mensajes en los foros.

    jueves, 7 de enero de 2021 18:06
  • Hola:
    Prueba este codigo

            Try
                Dim actualizar As String = "UPDATE Pedidos SET Expediente=@Expediente, Servicio=@Servicio, Fecha=@Fecha, Solicitud=@Solicitud, [Tipo de pedido]=@TipoPedido, Nota=@Nota, Carpeta=@Carpeta, [Cargado a GDE]= @GargadoGDE, OC=@OC, Proveedor=@Proveedor, Estado=@Estado WHERE Expediente = @Expediente1"
                Using lConexion As New OleDbConnection(TU_CADENA_DE_CONEXION)
                    lConexion.Open()
                    Using lComando As New OleDbCommand(actualizar, lConexion)
                        lComando.Parameters.Add(New OleDbParameter("@Expediente", TextBox8.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Servicio", TextBox2.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Fecha", TextBox3.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Solicitud", TextBox4.Text))
                        lComando.Parameters.Add(New OleDbParameter("@TipoPedido", TextBox5.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Nota", TextBox6.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Carpeta", TextBox7.Text))
                        lComando.Parameters.Add(New OleDbParameter("@CargadoGDE", TextBox9.Text))
                        lComando.Parameters.Add(New OleDbParameter("@OC", TextBox10.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Proveedor", TextBox11.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Estado", TextBox12.Text))
                        lComando.Parameters.Add(New OleDbParameter("@Expediente1", TextBox1.Text))
                        lComando.ExecuteNonQuery()
                    End Using
                End Using
                MessageBox.Show("El Registro ha sido actualizado con exito", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
            Button4.Visible = False
            Button3.Visible = True
            Button4.Enabled = False
            Button3.Enabled = False
            Call LimpiarTextBox(Me)

    Observaciones:
    1.- NO se debe modificar un campo que es llave primaria (En tu caso el expediente)
    2.- NO se deben de crear nombres de campos con espacios porque esto te obliga a poner dicho nombre entre corchetes (En tu caso el Cargado a GDE, es mejor poner Cargado_a_GDE es decir sustituir los espacios por giones bajos)
    3.- Utiliza parametros como es este caso en vez de concatenar un string, te evitaras dolores de cabeza

    Un saludo desde Bilbo
    Carlos


    jueves, 7 de enero de 2021 18:30
  • Hola,

    ¿Alguna novedad sobre la consulta realizada?

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    • Marcado como respuesta shereckann viernes, 8 de enero de 2021 16:43
    • Desmarcado como respuesta shereckann viernes, 8 de enero de 2021 16:43
    jueves, 7 de enero de 2021 18:53
    Moderador
  • muchas gracias, lo pruebo y te comento luego como fue
    • Marcado como respuesta shereckann viernes, 8 de enero de 2021 16:43
    viernes, 8 de enero de 2021 11:45
  • muchas gracias, lo pruebo y te comento luego como fue
    • Marcado como respuesta shereckann viernes, 8 de enero de 2021 16:43
    viernes, 8 de enero de 2021 11:48
  • Funciono perfectamente, muchísimas gracias
    • Marcado como respuesta shereckann viernes, 8 de enero de 2021 16:43
    viernes, 8 de enero de 2021 16:42
  • Hola:
    ¿ NO tienes nada que decir acerca de las observaciones ?

    Un saludo desde Bilbo
    Carlos
    viernes, 8 de enero de 2021 17:27