Principales respuestas
Actualizar BD Access desde DataGridView

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 ClassY ESTE ES EL FORMULARIO
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 ClassCONCLUSIÓ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
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"
-
-
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.
-
-
porque pones esta linea
oCB.GetUpdateCommand()
sola
no sera que debes usar
MyDataAdapter.UpdateCommand = oCB.GetUpdateCommand()
Leandro Tuttini
hola, voy a probar y a ver que pasa...
Blog
Buenos Aires
Argentina
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.
-
-
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 ClassCONCLUSIÓ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