none
actualizar una bd en access enlazada a un datagridview en visual basic 2012 RRS feed

  • Pregunta

  • estimados

       cuando quiero actualizar una base de datos en access(el campo clave es codalumno) desde un datagridview me sale el siguiente error "update requiere que updatecommand sea valida cuando se pasa la coleccion de datarow  con filas modificadas".

    Desde ya muchas gracias por vuestra colaboración

    El código es el siguiente:

     Imports System
    Imports System.Data

    Public Class frmaalumnos

        Private bindingSource1 As New BindingSource              'Crear el enlace de origen
        Private Adap As New OleDb.OleDbDataAdapter      'Crear el Adaptador de datos

    Private Sub frmalumnos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
           
            conectarse()
            Me.dgbvista4.DataSource = Me.bindingSource1         'Enlazar el DataGrid con el 'bindingsource
            LeerDatos("SELECT CODALUMNO,DNI,APELLIDOS,NOMBRES,CUIL,FECHANAC,SEXO,FIJO, CELULAR,CORREO,CALLE,NRO,DPTO,BARRIO,LOCALIDAD,DNITUTOR,APETUTOR,CELULARTUTOR,CORREOTUTOR FROM  ALUMNOS ORDER BY APELLIDOS")

    end sub

               

     Private Sub LeerDatos(ByVal selectCommand As String)

            Try
                Dim adap As New OleDb.OleDbDataAdapter(selectCommand, conn)
                Dim commandbuilder As New OleDb.OleDbCommandBuilder(adap)
                Dim tabla As New DataTable
                adap.Fill(tabla)
                bindingSource1.DataSource = tabla

               ' Dimensionar las columnas del DataGrid para ajustalarlas al contenido cargado
                Me.dgbvista4.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
            Catch ex As Exception
                MessageBox.Show("Excepcion al leer los datos:" + ex.Message)
            End Try

                End Sub

      Private Sub actualizar_Click(sender As Object, e As EventArgs) Handles actualizar.Click

             Me.Adap.Update(CType(bindingSource1.DataSource, DataTable))
                MessageBox.Show("Información actualizada", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

       

    jueves, 29 de mayo de 2014 20:23

Respuestas

  • "carmen579" preguntó:

    > cuando quiero actualizar una base de datos en access (el campo clave
    > es codalumno) desde un datagridview me sale el siguiente error
    > "update requiere que updatecommand sea valida cuando se pasa la
    > coleccion de datarow  con filas modificadas".

    Hola:

    Para no obtener ese error tienes que configurar correctamente las propiedades InsertCommand, UpdateCommand y DeleteCommand del objeto adaptador de datos (adap), para que éste sepa qué consultas SQL de acción tiene que ejecutar a la hora de llamar a su método Update.

    > Private Sub LeerDatos(ByVal selectCommand As String)
    >
    >    Dim adap As New OleDb.OleDbDataAdapter(selectCommand, conn)

    Fíjate que en el método LeerDatos estás creando un nuevo objeto OleDbDataAdapter, objeto que estará solo disponible para dicho método. Cuando finalice dicho procedimiento, se destruirá automáticamente.

    > Private Sub actualizar_Click(sender As Object, e As EventArgs) Handles actualizar.Click
    >
    >    Me.Adap.Update(CType(bindingSource1.DataSource, DataTable))

    Y en el método actualizar_Click estás haciendo uso de un supuesto objeto OleDbDataAdapter llamado 'Adap', que se comprende que lo tienes declarado a nivel del formulario o clase, por tanto, este objeto es DIFERENTE del objeto adaptador de datos de igual nombre declarado en el método LeerDatos.

    Si a nivel del proyecto tienes la siguiente declaración:

       
    Private adap As OleDb.OleDbDataAdapter

    lo correcto es que utilices el mismo objeto tanto en el método LeerDatos como en el método actualizar_Click:

        Private Sub LeerDatos(ByVal selectCommand As String)
    
            Try
                ' Creamos un nuevo adaptador de datos.
                '
                Adap = New OleDb.OleDbDataAdapter(selectCommand, conn)
    
                Dim commandbuilder As New OleDb.OleDbCommandBuilder(adap)
                adap.InsertCommand = commandbuilder.GetInsertCommand()
                adap.UpdateCommand = commandbuilder.GetUpdateCommand()
                adap.DeleteCommand = commandbuilder.GetDeleteCommand()
    
                Dim tabla As New DataTable()
                adap.Fill(tabla)
                bindingSource1.DataSource = tabla
    
                ' Dimensionar las columnas del DataGrid para ajustalarlas al contenido cargado 
                Me.dgbvista4.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
    
            Catch ex As Exception
                MessageBox.Show("Excepcion al leer los datos:" + ex.Message)
    
            End Try
    
        End Sub

    En el método LeerDatos creamos un nuevo objeto OleDbDataAdapter y configuramos sus propiedades XXXCommand. Te advierto que la tabla de la base de datos que deseas actualizar tiene que tener establecida su correspondiente clave principal, porque de no ser así, de nada te sirve utilizar un objeto OleDbCommandBuilder.

    Y el método actualizar_Click se quedaría así:

        Private Sub actualizar_Click(sender As Object, e As EventArgs) Handles Button1.Click ' actualizar.Click
    
            Try
                If (Me.Adap Is Nothing) Then
                    Throw New ArgumentException("No se ha creado el adaptador de datos.")
                End If
    
                Me.Adap.Update(CType(bindingSource1.DataSource, DataTable))
    
                MessageBox.Show("Información actualizada", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information)
    
            Catch ex As Exception
                MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    
            End Try
    
        End Sub

    Tienes que tener la precaución para que primero se ejecute el método LeerDatos, que es donde se crea la instancia del objeto Adap, y posteriormente el método actualizar_Click, porque si se ejecuta este primero, puede que obtengas una excepción si el objeto tiene un valor Nothing.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.

    sábado, 31 de mayo de 2014 17:06
    Moderador

Todas las respuestas

  • "carmen579" preguntó:

    > cuando quiero actualizar una base de datos en access (el campo clave
    > es codalumno) desde un datagridview me sale el siguiente error
    > "update requiere que updatecommand sea valida cuando se pasa la
    > coleccion de datarow  con filas modificadas".

    Hola:

    Para no obtener ese error tienes que configurar correctamente las propiedades InsertCommand, UpdateCommand y DeleteCommand del objeto adaptador de datos (adap), para que éste sepa qué consultas SQL de acción tiene que ejecutar a la hora de llamar a su método Update.

    > Private Sub LeerDatos(ByVal selectCommand As String)
    >
    >    Dim adap As New OleDb.OleDbDataAdapter(selectCommand, conn)

    Fíjate que en el método LeerDatos estás creando un nuevo objeto OleDbDataAdapter, objeto que estará solo disponible para dicho método. Cuando finalice dicho procedimiento, se destruirá automáticamente.

    > Private Sub actualizar_Click(sender As Object, e As EventArgs) Handles actualizar.Click
    >
    >    Me.Adap.Update(CType(bindingSource1.DataSource, DataTable))

    Y en el método actualizar_Click estás haciendo uso de un supuesto objeto OleDbDataAdapter llamado 'Adap', que se comprende que lo tienes declarado a nivel del formulario o clase, por tanto, este objeto es DIFERENTE del objeto adaptador de datos de igual nombre declarado en el método LeerDatos.

    Si a nivel del proyecto tienes la siguiente declaración:

       
    Private adap As OleDb.OleDbDataAdapter

    lo correcto es que utilices el mismo objeto tanto en el método LeerDatos como en el método actualizar_Click:

        Private Sub LeerDatos(ByVal selectCommand As String)
    
            Try
                ' Creamos un nuevo adaptador de datos.
                '
                Adap = New OleDb.OleDbDataAdapter(selectCommand, conn)
    
                Dim commandbuilder As New OleDb.OleDbCommandBuilder(adap)
                adap.InsertCommand = commandbuilder.GetInsertCommand()
                adap.UpdateCommand = commandbuilder.GetUpdateCommand()
                adap.DeleteCommand = commandbuilder.GetDeleteCommand()
    
                Dim tabla As New DataTable()
                adap.Fill(tabla)
                bindingSource1.DataSource = tabla
    
                ' Dimensionar las columnas del DataGrid para ajustalarlas al contenido cargado 
                Me.dgbvista4.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
    
            Catch ex As Exception
                MessageBox.Show("Excepcion al leer los datos:" + ex.Message)
    
            End Try
    
        End Sub

    En el método LeerDatos creamos un nuevo objeto OleDbDataAdapter y configuramos sus propiedades XXXCommand. Te advierto que la tabla de la base de datos que deseas actualizar tiene que tener establecida su correspondiente clave principal, porque de no ser así, de nada te sirve utilizar un objeto OleDbCommandBuilder.

    Y el método actualizar_Click se quedaría así:

        Private Sub actualizar_Click(sender As Object, e As EventArgs) Handles Button1.Click ' actualizar.Click
    
            Try
                If (Me.Adap Is Nothing) Then
                    Throw New ArgumentException("No se ha creado el adaptador de datos.")
                End If
    
                Me.Adap.Update(CType(bindingSource1.DataSource, DataTable))
    
                MessageBox.Show("Información actualizada", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information)
    
            Catch ex As Exception
                MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    
            End Try
    
        End Sub

    Tienes que tener la precaución para que primero se ejecute el método LeerDatos, que es donde se crea la instancia del objeto Adap, y posteriormente el método actualizar_Click, porque si se ejecuta este primero, puede que obtengas una excepción si el objeto tiene un valor Nothing.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.

    sábado, 31 de mayo de 2014 17:06
    Moderador
  • Estimado Enrique 

                      ya hice los cambios que propones, y esta funcionando correctamente .

    Muchas gracias por tu colaboración

    Saludos

    Carmen

    lunes, 2 de junio de 2014 19:59