Foros del Web » Programación para mayores de 30 ;) » .NET »

Como guardar datos de celda de DataGridView a la BD

Estas en el tema de Como guardar datos de celda de DataGridView a la BD en el foro de .NET en Foros del Web. Hola a todos esta es la cuestion: Tengo un control DatagridView y este control lo lleno con los datos de una DataTable... bien ahora necesito ...
  #1 (permalink)  
Antiguo 08/01/2008, 12:50
Avatar de juanutcm
Usuario no validado
 
Fecha de Ingreso: marzo-2005
Mensajes: 194
Antigüedad: 19 años, 1 mes
Puntos: 0
Pregunta Como guardar datos de celda de DataGridView a la BD

Hola a todos esta es la cuestion:

Tengo un control DatagridView y este control lo lleno con los datos de una DataTable... bien ahora necesito que al momento que el usuario modifique el contenido de una celda especifica del DataGridView se guarde directamente en la base de datos ...¿Cómo puedo hacer esto?...

Por su informacion gracias... y cualquier referencia que involucre este tema sera bienvenida...
  #2 (permalink)  
Antiguo 10/01/2008, 11:30
Avatar de royrojas  
Fecha de Ingreso: diciembre-2004
Mensajes: 458
Antigüedad: 19 años, 4 meses
Puntos: 3
Re: Como guardar datos de celda de DataGridView a la BD

podrias usar data adapter para actualizar un grupo de registros.
o
podrias identificar la linea que se modifico y actualizar esa linea. cada row tiene una propiedad, eliminada, nueva, actualizada, identificas la linea y la actualizas.
__________________
roy rojas
Programación en Español: DotNetcr.com
  #3 (permalink)  
Antiguo 15/01/2008, 13:04
Avatar de juanutcm
Usuario no validado
 
Fecha de Ingreso: marzo-2005
Mensajes: 194
Antigüedad: 19 años, 1 mes
Puntos: 0
Como guardar datos de celda de DataGridView a la BD

Código:
 
 
''
Imports System
Imports System.Data
Imports System.Windows.Forms
Imports MySql.Data.MySqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private dataGridView1 As New DataGridView() 'Llamar al constructor el dataGridView
Private bindingSource1 As New BindingSource() 'Crear el enlace de origen
Private AdaptadorDeDatos As New MySqlDataAdapter 'Crear el Adaptador de datos
Private WithEvents BotonCargarDatos As New Button() 'Boton Cargar datos
Private WithEvents BotonActualizarDatos As New Button() 'Boton Actualizar (Update)
Private WithEvents BotonEliminarFila As New Button() 'Boton Eliminar fila
<STAThreadAttribute()> _
Public Shared Sub Main()
Application.Run(New Form1()) 'Ejecutar aplicacion
End Sub
''
'' Inicializar el form y controles.
''
Public Sub New()
Me.dataGridView1.Dock = DockStyle.Fill 'dock del dataGrid
Me.BotonCargarDatos.Text = "Cargar" 'Asignar texto funcion a los botones
Me.BotonActualizarDatos.Text = "Actualizar"
Me.BotonEliminarFila.Text = "Eliminar"
 
Dim panel As New FlowLayoutPanel() 'Crear panel
panel.Dock = DockStyle.Top 'Asignar dock
panel.AutoSize = True 'definir tamaño
'Añadir botones
panel.Controls.AddRange(New Control() {Me.BotonCargarDatos, Me.BotonActualizarDatos, Me.BotonEliminarFila})
'Anadir Datagrid a la coleccion de controles
Me.Controls.AddRange(New Control() {Me.dataGridView1, panel})
Me.Text = "Ejemplo : DataGridView/Actualizacion - BD's Access"
End Sub
''
'' Al cargar el Form
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Me.dataGridView1.DataSource = Me.bindingSource1 'Enlazar el DataGrid con el 'bindingsource
LeerDatos("SELECT EVALUACIONES.*, MATERIAS.NumeroSemestre FROM EVALUACIONES, " & _
"MATERIAS WHERE EVALUACIONES.IdMateria = MATERIAS.IdMateria AND " & _
"(EVALUACIONES.Matricula = '0350008') AND (MATERIAS.NumeroSemestre = '8') " & _
"ORDER BY EVALUACIONES.ClaveMateria") 'obtener los datos (Sub 'LeerDatos')
End Sub
''
''Boton de cargar datos
Private Sub Cargar(ByVal sender As Object, ByVal e As System.EventArgs) Handles BotonCargarDatos.Click
' Cargar los datos desde la Bd
LeerDatos(Me.AdaptadorDeDatos.SelectCommand.CommandText)
End Sub
''
''Boton de actualizar los datos
Private Sub Actualizar(ByVal sender As Object, ByVal e As System.EventArgs) Handles BotonActualizarDatos.Click
' Actualizar la base de datos con los cambios efectuados en el DataGrid
Me.AdaptadorDeDatos.Update(CType(Me.bindingSource1.DataSource, DataTable))
End Sub
''
''Boton de Eliminar fila
Private Sub Columna_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BotonEliminarFila.Click
' Eliminar una linia del DataGrid
Me.dataGridView1.Rows.Remove(Me.dataGridView1.CurrentRow)
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 = "server=201.155.201.211;user id=desarrollador;password=ds03;database=sie"
' Crear un nuevo adaptador de datos vasado en el 'query' especificado
Me.AdaptadorDeDatos = New MySqlDataAdapter(selectCommand, connectionString)
' Crear un 'commandbuilder' que genere el SQL Update/Insert/Delete
' segun el 'selectcommand', usado para actualizar la BD
Dim commandbuilder As New MySqlCommandBuilder(Me.AdaptadorDeDatos)
' Llenar la tabla con los datos y enlazarza con el 'bindingsource'
Dim tabla As New DataTable()
Me.AdaptadorDeDatos.Fill(tabla)
Me.bindingSource1.DataSource = tabla
' Dimensionar las columnas del DataGrid para ajustalarlas al contenido cargado
Me.dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
Catch ex As Exception
MessageBox.Show("Excepcion al leer los datos:" + ex.Message)
End Try
End Sub
End Class
bien en este codigo funciona bien al momento de llenar los datos en el grid pero al momento de actualizar algun dato del grid me manda el siguiente error:

InvalidOperationException was unhandled
La generación SQL dinámica no es compatible con varias tablas de base.

...eso quiere decir que no acepta el query de varias tablas.... existirá alguna manera de que pueda funcionar correctamente asi como esta el query? o unicamente se puede con una sola tabla?...

Última edición por juanutcm; 15/01/2008 a las 13:05 Razón: redaccion erronea
  #4 (permalink)  
Antiguo 17/01/2008, 17:22
Avatar de juanutcm
Usuario no validado
 
Fecha de Ingreso: marzo-2005
Mensajes: 194
Antigüedad: 19 años, 1 mes
Puntos: 0
Re: Como guardar datos de celda de DataGridView a la BD

Bien lo consegui aunque no es una solucion que me convenza mucho pero bueno... despues con mas calma pensare en alguna otra alternativa... el codigo que puse anteriormente funciona si los datos los obtienes de una sola tabla pero en mi caso la consulta involucraba dos tablas con parametros :

Código:
 
"SELECT EVALUACIONES.*, MATERIAS.NumeroSemestre FROM EVALUACIONES, " & _
"MATERIAS WHERE EVALUACIONES.IdMateria = MATERIAS.IdMateria AND " & _
"(EVALUACIONES.Matricula = ?Matricula) AND (MATERIAS.NumeroSemestre = ?NumeroSemestre) " & _
"ORDER BY EVALUACIONES.ClaveMateria"
y al momento de querer actualizar la tabla me marcaba error:

Código:
 
La generación SQL dinámica no es compatible con varias tablas de base. 
y hasta donde tengo entendido lo anterior solo funciona con una tabla y lo que hice yo fue obtener el dato de la celda y despues realizar la consulta para guardar y actualizar el dato...

Código:

Case 9 'Numero de columna o campo "Evalua1"
If (Me.dgdEvaluaciones.CurrentCell.Value.ToString.ToUpper = "NP") Or (Me.dgdEvaluaciones.CurrentCell.Value.ToString.Length = 0) Then'Validar y cnvertir los datos requeridos del campo
Me.dgdEvaluaciones.CurrentCell.Value = Me.dgdEvaluaciones.CurrentCell.Value.ToString.ToUpper 'Asginar contenido al campo 
Me.myCommand.Parameters.Clear()
Me.myCommand.Connection.Close()
Me.myCommand.Connection = cnnServidorMysql
Me.myCommand.CommandText = mdlConsultasPublicas.ObtenerCadenaActualizarEvaluacion1Evaluaciones
Me.myCommand.Parameters.Add("?Evalua1", MySqlDbType.VarChar)
Me.myCommand.Parameters.Add("?IdEvaluaciones", MySqlDbType.Int32)
Me.myCommand.Parameters("?Evalua1").Value = Me.dgdEvaluaciones.CurrentCell.Value.ToString.ToUpper
Me.myCommand.Parameters("?IdEvaluaciones").Value = XmlConvert.ToInt32(Me.dgdEvaluaciones.CurrentRow.Cells(0).Value.ToString)
 
Me.myCommand.Connection.Open()
Me.myCommand.ExecuteReader()
Me.myCommand.Connection.Close()
Else
Try
datoEntero = Me.dgdEvaluaciones.CurrentCell.Value 'Asignar contenido a la variable
datoEntero = XmlConvert.ToInt32(datoEntero) 'Convertir dato en Entero
If ((datoEntero >= 0) And (datoEntero <= 10)) Then'Validar el la variable correspondiente
Me.dgdEvaluaciones.CurrentCell.Value = Me.dgdEvaluaciones.CurrentCell.Value.ToString.ToUpper 'Asginar contenido al campo 
Me.myCommand.Parameters.Clear()
Me.myCommand.Connection.Close()
Me.myCommand.Connection = cnnServidorMysql
Me.myCommand.CommandText = mdlConsultasPublicas.ObtenerCadenaActualizarEvaluacion1Evaluaciones
Me.myCommand.Parameters.Add("?Evalua1", MySqlDbType.VarChar)
Me.myCommand.Parameters.Add("?IdEvaluaciones", MySqlDbType.Int32)
Me.myCommand.Parameters("?Evalua1").Value = Me.dgdEvaluaciones.CurrentCell.Value
Me.myCommand.Parameters("?IdEvaluaciones").Value = XmlConvert.ToInt32(Me.dgdEvaluaciones.CurrentRow.Cells(0).Value.ToString)
 
Me.myCommand.Connection.Open()
Me.myCommand.ExecuteReader()
Me.myCommand.Connection.Close()
Else
MsgBox(mdlMensajesPublicos.ObtenerMensajeAplicacion("ER082"), MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, mdlMensajesPublicos.ObtenerMensajeAplicacion("ER000")) 'Obtener el mensaje y enviar mensaje
Me.dgdEvaluaciones.CancelEdit() 'Cancelar la modificacion del dato de la celda seleccionada
EndIf'Fin de validar la variable correspondiente
Catch ex As Exception
MsgBox(mdlMensajesPublicos.ObtenerMensajeAplicacion("ER082"), MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, mdlMensajesPublicos.ObtenerMensajeAplicacion("ER000")) 'Obtener el mensaje y enviar mensaje
Me.dgdEvaluaciones.CancelEdit() 'Cancelar la modificacion del dato de la celda seleccionada
EndTry
EndIf'Fin de validar y convertir los campos requeridos
 
menciono tambien que tenia que validar que tipo de dato se insertaba ...

espero esto sirva a alguien... hasta pronto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 11:35.