none
Actualizar BD Access desde DataGridView RRS feed

  • Pregunta

  • Hola, lo que sucede es que tengo una base de datos access y muestro los datos de la tabla "PRODUCTOS" en un DataGridView, el tema es quiero que presionar un menú de "GUARDAR", para que actualice la base de datos con los cambios realizados, he buscado en foros y no me resulta mi código, debo comentar que soy programador por iniciativa propia, tal vez si me reparan el código, con mucha atención puedo entender su estructura, mas abajo pongo mi código, desde ya muy agradecido por cualquier aporte.

    <marquee>PD: LA BASE DE DATOS ESTA ESCRITA EN UNA ETIQUETA EN UN MDIFORM.</marquee>


    Imports System.Data.OleDb
    Imports System.Data.Odbc

    Public Class PRODUCTOS
        Dim oCB As OleDbCommandBuilder
        Dim changes As DataSet
        Dim Conexion As New OleDbConnection
        Dim MyDataSet As DataSet
        Dim MyDataAdapter As OleDbDataAdapter
        Private Sub PRODUCTOS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Conexion = New OleDbConnection With {.ConnectionString = "Provider=Microsoft.ACE.OleDb.12.0;Data Source= " & VPrincipal.conexion.Text & ";"}
            ' crear commandbuilder 
            Dim oCB As OleDbCommandBuilder = New OleDbCommandBuilder(MyDataAdapter)
            MyDataSet = New DataSet
            Try
                MyDataAdapter = New OleDbDataAdapter("SELECT * FROM PRODUCTOS", Conexion)
                MyDataAdapter.Fill(MyDataSet, "PRODUCTOS")
                'Cargamos BindingSource con el DataSet 
                ' BindingSource1.DataSource = MyDataSet
                'BindingSource1.DataMember = "PRODUCTOS"
                DataGridView1.DataSource = MyDataSet.Tables("PRODUCTOS")
                DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.PeachPuff
                Me.WindowState = FormWindowState.Maximized
            Catch EX As Exception
                MsgBox(EX.Message)
            End Try
        End Sub

        Private Sub CerrarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CerrarToolStripMenuItem.Click
            Me.Close()
        End Sub

    ESTA PARTE ES PARA UPDATE, PERO AL EJECUTAR EL CODIGO ME DICE QUE FALTA OPERADOR EN LA SENTENCIA SQL Y NO HACE NADA

        Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
               Try
                oCB = New OleDbCommandBuilder(MyDataAdapter)
                oCB.GetUpdateCommand()
                changes = MyDataSet.GetChanges()
                If changes IsNot Nothing Then
                    oCB.SetAllValues = True
                    MyDataAdapter.Update(MyDataSet.Tables("PRODUCTOS"))
                End If
                MsgBox("Changes Done")
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
            'MyDataAdapter.UpdateCommand = New OleDbCommand("UPDATE PRODUCTOS SET CODIGO=*, NOMBRE=*", Conexion)
            'Me.MyDataAdapter.Update(MyDataSet, "PRODUCTOS")
        End Sub
    End Class

    Y ESTE ES EL FORMULARIO

    EXISTE SUB-MENU PARA GUARDAR CAMBIOS

    jueves, 11 de octubre de 2012 19:42

Respuestas

  • LO QUE PASA ES QUE ENCONTRE UN FORO CON UN CODIGO QUE LO HACE, LO ADAPTE A MI PROGRAMA Y ME DABA ERROR POR EL TIPO DE DATOS A A ALMACENAR, ENTONCES LO COMBINE CON EL DE OTRO FORO MAS Y ME RESULTÓ.

    MI CODIGO QUEDO ASÍ....

    Imports System
    Imports System.Data
    Public Class Maestro_Productos

        Private Property AdaptadorDeDatos As OleDb.OleDbDataAdapter

        Private Sub Maestro_Productos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.DataGridView1.DataSource = Me.BindingSource1         'Enlazar el DataGrid con el 'bindingsource
            DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
            LeerDatos("select * from PRODUCTOS")                    'obtener los datos (Sub 'LeerDatos')

        End Sub
        Private Sub LeerDatos(ByVal selectCommand As String)
            Try
                ' Especificar un 'connection string' valido
                ' En este caso origen de la carpeta de la aplicacion BD1.mdb
                Dim connectionString As String = "Provider=Microsoft.ACE.OleDb.12.0;Data Source=" & VPrincipal.conexion.Text

                ' Crear un nuevo adaptador de datos vasado en el 'query' especificado
                AdaptadorDeDatos = New OleDb.OleDbDataAdapter(selectCommand, connectionString)

                ' Crear un 'commandbuilder' que genere el SQL Update/Insert/Delete
                ' segun el 'selectcommand', usado para actualizar la BD
                Dim commandbuilder As New OleDb.OleDbCommandBuilder(AdaptadorDeDatos)
                Dim tabla As New DataTable()
                ' Llenar la tabla con los datos y enlazarza con el 'bindingsource'
                AdaptadorDeDatos.FillSchema(tabla, SchemaType.Source)
                tabla.Columns("CODIGO").DataType = GetType(System.String)
                tabla.Columns("NOMBRE").DataType = GetType(System.String)
                tabla.Columns("MEDIDA").DataType = GetType(System.String)
                tabla.Columns("TIPO").DataType = GetType(System.String)
                tabla.Columns("INGRESADO").DataType = GetType(System.Int32)
                tabla.Columns("VENDIDO").DataType = GetType(System.Int32)
                tabla.Columns("STOCK").DataType = GetType(System.Int32)
                tabla.Columns("PRECIOCOMPRA").DataType = GetType(System.Int32)
                tabla.Columns("PRECIOVENTA").DataType = GetType(System.Int32)
                tabla.Columns("IMPUESTO").DataType = GetType(System.Double)
                tabla.Columns("NOMBREIMPUESTO").DataType = GetType(System.String)
                Me.AdaptadorDeDatos.Fill(tabla)
                Me.BindingSource1.DataSource = tabla
            Catch ex As Exception
                MessageBox.Show("Excepcion al leer los datos:" + ex.Message)
            End Try
        End Sub
        Private Sub CargarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CargarToolStripMenuItem.Click
            Try
                ' Cargar los datos desde la Bd
                LeerDatos(AdaptadorDeDatos.SelectCommand.CommandText)
                DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

        Private Sub GuardarCambiosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GuardarCambiosToolStripMenuItem.Click
            Try
                ' Actualizar la base de datos con los cambios efectuados en el DataGrid
                AdaptadorDeDatos.Update(CType(Me.BindingSource1.DataSource, DataTable)) 'DataTable))
                DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
                MsgBox("Modificación exitosa.", vbOKOnly + vbInformation)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

        Private Sub EliminarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EliminarToolStripMenuItem.Click
            ' Eliminar una linia del DataGrid
            DataGridView1.Rows.Remove(Me.DataGridView1.CurrentRow)
            DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        End Sub
    End Class

    CONCLUSIÓN:

    LOS DATOS A ALMACENAR, DEBEN ESTAR EN EL MISMO FORMATO QUE LA CONFIGURACION DE LA BD, O EN UNO SIMILAR, PARA QUE NO ARROJE ERROR.

    GRACIAS POR LOS APORTES


    Juan J. Villarroel C.

    • Marcado como respuesta GUSANO_LIVE sábado, 13 de octubre de 2012 0:06
    sábado, 13 de octubre de 2012 0:05

Todas las respuestas

  • Saludos en este articulo hablan de ese tema analizalo

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/21a8bcfa-e830-47b2-ac50-1a42d6131dff

    Suerte!!


    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Proponer como respuesta"

    jueves, 11 de octubre de 2012 21:19
  • porque pones esta linea

    oCB.GetUpdateCommand()

    sola

    no sera que debes usar

    MyDataAdapter.UpdateCommand = oCB.GetUpdateCommand()


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 12 de octubre de 2012 4:14
  • Saludos en este articulo hablan de ese tema analizalo

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/21a8bcfa-e830-47b2-ac50-1a42d6131dff

    Suerte!!


    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Proponer como respuesta"

    gracias por responder, pero ya habia visitado esa seccion, el tema esque descargue un codigo que lo realiza y el temas es la conversion de datos para cada elemento del datagrid, en el ejemplo se utiliza lo siguiente

     Me.AdaptadorDeDatos.Update(CType(Me.bindingSource1.DataSource, DataTable))

    y si guarda, pero todos los datos de la BD deben ser del tipo texto. si alguien sabe como areglarlo...


    Juan J. Villarroel C.

    viernes, 12 de octubre de 2012 13:49
  • porque pones esta linea

    oCB.GetUpdateCommand()

    sola

    no sera que debes usar

    MyDataAdapter.UpdateCommand = oCB.GetUpdateCommand()


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    hola, voy a probar y a ver que pasa...

    Juan J. Villarroel C.

    viernes, 12 de octubre de 2012 13:50
  • porque pones esta linea

    oCB.GetUpdateCommand()

    sola

    no sera que debes usar

    MyDataAdapter.UpdateCommand = oCB.GetUpdateCommand()


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    hola, voy a probar y a ver que pasa...

    Juan J. Villarroel C.

    NO RESULTÓ, YA ENCONTRÉ MI PROBLEMA, ES POR EL TIPO DE DATOS....

    PERO AÚN NO SE COMO SOLUCIONAR ESTO PARA GUARDAR SIN QUE TIRE ERROR.


    Juan J. Villarroel C.

    viernes, 12 de octubre de 2012 16:06
  • Que te pasa con el tipo de dato explicate?

    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Proponer como respuesta"

    viernes, 12 de octubre de 2012 17:26
  • LO QUE PASA ES QUE ENCONTRE UN FORO CON UN CODIGO QUE LO HACE, LO ADAPTE A MI PROGRAMA Y ME DABA ERROR POR EL TIPO DE DATOS A A ALMACENAR, ENTONCES LO COMBINE CON EL DE OTRO FORO MAS Y ME RESULTÓ.

    MI CODIGO QUEDO ASÍ....

    Imports System
    Imports System.Data
    Public Class Maestro_Productos

        Private Property AdaptadorDeDatos As OleDb.OleDbDataAdapter

        Private Sub Maestro_Productos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.DataGridView1.DataSource = Me.BindingSource1         'Enlazar el DataGrid con el 'bindingsource
            DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
            LeerDatos("select * from PRODUCTOS")                    'obtener los datos (Sub 'LeerDatos')

        End Sub
        Private Sub LeerDatos(ByVal selectCommand As String)
            Try
                ' Especificar un 'connection string' valido
                ' En este caso origen de la carpeta de la aplicacion BD1.mdb
                Dim connectionString As String = "Provider=Microsoft.ACE.OleDb.12.0;Data Source=" & VPrincipal.conexion.Text

                ' Crear un nuevo adaptador de datos vasado en el 'query' especificado
                AdaptadorDeDatos = New OleDb.OleDbDataAdapter(selectCommand, connectionString)

                ' Crear un 'commandbuilder' que genere el SQL Update/Insert/Delete
                ' segun el 'selectcommand', usado para actualizar la BD
                Dim commandbuilder As New OleDb.OleDbCommandBuilder(AdaptadorDeDatos)
                Dim tabla As New DataTable()
                ' Llenar la tabla con los datos y enlazarza con el 'bindingsource'
                AdaptadorDeDatos.FillSchema(tabla, SchemaType.Source)
                tabla.Columns("CODIGO").DataType = GetType(System.String)
                tabla.Columns("NOMBRE").DataType = GetType(System.String)
                tabla.Columns("MEDIDA").DataType = GetType(System.String)
                tabla.Columns("TIPO").DataType = GetType(System.String)
                tabla.Columns("INGRESADO").DataType = GetType(System.Int32)
                tabla.Columns("VENDIDO").DataType = GetType(System.Int32)
                tabla.Columns("STOCK").DataType = GetType(System.Int32)
                tabla.Columns("PRECIOCOMPRA").DataType = GetType(System.Int32)
                tabla.Columns("PRECIOVENTA").DataType = GetType(System.Int32)
                tabla.Columns("IMPUESTO").DataType = GetType(System.Double)
                tabla.Columns("NOMBREIMPUESTO").DataType = GetType(System.String)
                Me.AdaptadorDeDatos.Fill(tabla)
                Me.BindingSource1.DataSource = tabla
            Catch ex As Exception
                MessageBox.Show("Excepcion al leer los datos:" + ex.Message)
            End Try
        End Sub
        Private Sub CargarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CargarToolStripMenuItem.Click
            Try
                ' Cargar los datos desde la Bd
                LeerDatos(AdaptadorDeDatos.SelectCommand.CommandText)
                DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

        Private Sub GuardarCambiosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GuardarCambiosToolStripMenuItem.Click
            Try
                ' Actualizar la base de datos con los cambios efectuados en el DataGrid
                AdaptadorDeDatos.Update(CType(Me.BindingSource1.DataSource, DataTable)) 'DataTable))
                DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
                MsgBox("Modificación exitosa.", vbOKOnly + vbInformation)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub

        Private Sub EliminarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EliminarToolStripMenuItem.Click
            ' Eliminar una linia del DataGrid
            DataGridView1.Rows.Remove(Me.DataGridView1.CurrentRow)
            DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        End Sub
    End Class

    CONCLUSIÓN:

    LOS DATOS A ALMACENAR, DEBEN ESTAR EN EL MISMO FORMATO QUE LA CONFIGURACION DE LA BD, O EN UNO SIMILAR, PARA QUE NO ARROJE ERROR.

    GRACIAS POR LOS APORTES


    Juan J. Villarroel C.

    • Marcado como respuesta GUSANO_LIVE sábado, 13 de octubre de 2012 0:06
    sábado, 13 de octubre de 2012 0:05