A menudo en los foros aparece la pregunta de cómo actualizar una BD utilizando un DataGridView. Aquí os dejo una forma de realizarlo. Espero que os sea útil.
Saludos,
Pep Lluis,
‘
‘Definir enlace a datos y objetos del form
Private MiConexion As New SqlConnection( _
“Datasource=.\SQLEXPRESS;AttachDbFilename=C:\Temp\NORTHWND.MDF” + _
“;Integrated Security=True;Connect Timeout=30;User Instance=True”)
Private MiAdaptador As New SqlDataAdapter(“SELECT * FROM Shippers”, MiConexion)
Private MiDataSet As New DataSet()
Private MiEnlazador As New BindingSource
Private MidataGriView As New DataGridView
Private BotonGuardar As New Button
‘
‘En tiempo de carga…
Private Sub Form1_Load(…..) Handles MyBase.Load
MessageBox.Show(My.Computer.FileSystem.CurrentDirectory)
‘Poner titulo a la aplicacion
Me.Text = “Mantenimiento de Shippers”
‘Añadir DataGriView
MidataGriView.Dock = DockStyle.Top
Me.Controls.Add(MidataGriView)
BotonGuardar.Dock = DockStyle.Bottom
‘Añadir Boton de Guardar
BotonGuardar.Text = “Guardar Cambios”
Me.Controls.Add(BotonGuardar)
AddHandler BotonGuardar.Click, AddressOf Guardar
Dim commandbuilder As New SqlCommandBuilder(Me.MiAdaptador)
MiConexion.Open()
MiAdaptador.Fill(MiDataSet)
MiEnlazador.DataSource = MiDataSet.Tables(0)
MidataGriView.DataSource = MiEnlazador
End Sub
‘
‘Actualizar la tabla enlazada con el DataGridView
Private Sub Guardar(…..)
Me.MiAdaptador.Update(CType(Me.MiEnlazador.DataSource, DataTable))
End Sub
Muy buen articulo, te felicito, estuve buscando en varios foros y nadie parece tener claro este tema.
Hola PepLluis, gracias por tu aportacion, muy buena, pero sabes quisiera saber si tendras algun ejemplo de codigo en V.B.Net donde por medio de datos que se obtienen de captura en Textbox, esos datos poder insertarlos en campos de una Tabla usando un procedimiento almacenado, se que no es complicado pero hay que saber el procedimiento y es algo que no he podido encontrar en internet, de antemano agradezco tus atenciones.
Hola Daniel,
Supongo que imperdonable, pero ciertamente no tengo ninguno. Tomo nota y veo si posteo alguno en cuanto tenga un hueco.
Saludos y gracias.
Hey esta muy bueno.
Pero no se podrias indicarnos como guardar datos de un datagridview no enlazado.
Yo lleno un datra grid view no enlazado a ni una tabla.
utilizo Insert Into pero solamente se guarda el primer registro
y cuando utilizo for each row
solo se almacena el ultimo registro de mi datagridview.
espero puedas ayudarme te lo agradecere mucho
Hola Gosuna,
Quizas lo mas practico sera que me mandes el fragmento de codigo que estas intentando, para poder ver como lo estas enfocando. Puedes hacerlo contactando directamente conmigo a traves de la opcion [Contact] de este blog.
Espero tus noticias,
Pep Lluis,
tengo un problema…..tengo un codigo que me inserta una columa de un dataGridView….pero lo hace muy lento; quisiera saber si existe alguna forma de como inserta todo un lote de dato a una BD ACCESS de una forma rapida!!!
Hola Ernesto,
Lamento no tener respuesta para esta pregunta… pues dependera de las condiciones que se presenten en tu maquina… procesador, entorno, version… y la mas importante, el procedimiento utilizado para realizar esa actualizacion. Sin mas detalles se hace imposible intuir la solucion.
Saludos,
Pep Lluis,
Excelente post,
Igual que Gosuna tengo la duda si funcionara con un datagrid no enlazado. Y no se si exista una forma de que solo se graben ciertas columnas en la base de datos.
Saludos
De antemano agradezco su ayuda
******
Les muestro el código uso para cargar un documento de texto a un datagrid:
‘Defino base de datos a la cual conectarse
Dim sqlconnection As New System.Data.SqlClient.SqlConnection(“Conexion al server”)
Dim cmd As New System.Data.SqlClient.SqlCommand
Dim myTable As DataTable = New DataTable(“MyTable”)
Dim i As Integer
Dim myRow As DataRow
Dim fieldValues As String()
Dim f As IO.File
Dim myReader As IO.StreamReader
Try
‘abre el archivo y cuenta cuantas columnas hay.
myReader = f.OpenText(“\\carpeta compartidadelared\archivodetexto.txt”)
fieldValues = myReader.ReadLine().Split(“|”)
‘Crea las columnas conforme deben de ir
For i = 0 To fieldValues.Length() – 1
myTable.Columns.Add(New DataColumn(“Field” & i))
Next
‘Añade la primer linea a la data table
myRow = myTable.NewRow
For i = 0 To fieldValues.Length() – 1
myRow.Item(i) = fieldValues(i).ToString
Next
myTable.Rows.Add(myRow)
‘Lee el resto y lo pasa al datatable
While myReader.Peek <> -1
fieldValues = myReader.ReadLine().Split(“|”)
myRow = myTable.NewRow
For i = 0 To fieldValues.Length() – 1
myRow.Item(i) = fieldValues(i).ToString
Next
myTable.Rows.Add(myRow)
End While
Me.DataGridView1.DataSource = myTable
Catch ex As Exception
MsgBox(“Error building datatable: ” & ex.Message)
‘Return New DataTable(“Empty”)
Finally
myReader.Close()
End Try
hola solo quiero saber como le hago para actualizar los datos y que no es dupliquen, es decir tengo este codigo…
Try
cad = “update vehiculo set num_motor='” & TextBox2.Text & _
“‘,num_serie=” & TextBox3.Text & _
“, marca= ‘” & TextBox4.Text & _
“‘,modelo= ” &TextBox5.Text & _
“, placas = ‘” & TextBox6.Text & _
” ‘, kilometros = ” & TextBox7.Text & _
” ,fecha_ing = ‘”DateTimePicker1.Value.ToShortDateString & _
“‘,otras_carct='” & TextBox19.Text & _
” where num_eco = ” & TextBox1.Text & “‘”
Dim comando As New SqlCommand(cad, sqlcon)
If sqlcon.State = ConnectionState.Closed Then
sqlcon.Open()
End If
comando.ExecuteNonQuery()
Catch
MsgBox(“Ocurrio un error, por lo tanto no se puede Guardar este registro”, MsgBoxStyle.ApplicationModal)
sqlcon.Close()
End Try
y si guarda los cambios nadamas que me duplica en todos los registros los mis mos datos que introdusco al modificar
si tiene un asolucion se lo agradecere.
espero la respuesta….
Hola Aracely,
En todo caso si estas utilizando un DataGridView, si sigues este ejemplo para actualizarlo solo necesitas :
‘
‘Actualizar la tabla enlazada con el DataGridView
Private Sub Guardar(…..)
Me.MiAdaptador.Update(CType(Me.MiEnlazador.DataSource, DataTable))
End Sub
En otro caso a falta de saber sobre el codigo que estas utilizando, puedes contactar directamente conmigo, para ver como puedo ayudarte.
Saludos,
Pep Lluis,
Podrias ayudarme ya que no he podido realizar la actualizacion desde el datagridview, me muestra el siguiente error:
INVALIDOPERATIONEXCEPTION WAS UNHANDLED.- La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave.
el codigo es el siguiente:
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Public Class FrmOpyMttoPozos
Dim stringConexion As String = “server=142.68.200.1;uid=sa;pwd=123;database=SIAP”
Private MiConexion As New SqlConnection(stringConexion)
Private MiAdaptador As New SqlDataAdapter(“SELECT * FROM tblOpyMtto”, MiConexion)
Private MiDataSet As New DataSet()
Private MiEnlazador As New BindingSource
Private Sub FrmOpyMttoPozos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim commandbuilder As New SqlCommandBuilder(Me.MiAdaptador)
MiConexion.Open()
MiAdaptador.Fill(MiDataSet)
MiEnlazador.DataSource = MiDataSet.Tables(0)
DataGridRevisiones.DataSource = MiEnlazador
End Sub
Private Sub cmdGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdGuardar.Click
Me.MiAdaptador.Update(CType(Me.MiEnlazador.DataSource, DataTable))
End Sub
Edwin,
Precisamente te esta avisando de que tu tabla no define ninguna clave y no puede generarte el commandbuilder… si defines una clave principal desaparecera tu problema.
Saludos,
Pep Lluis,
TENGO EL SIGUIENTE CODIGO PERO AL ENTRAR AL UPDATE ME DEVUELVE EL SIGUIENTE ERROR:(LA FECHA EN EL DGV ESTA EN dd/MM/yyyy) EJEMPLO 01/04/2011
CODIGO
If (MsgBox(“QUIERES GUARDAR LOS CAMBIOS ?”, MsgBoxStyle.YesNo, “GUARDAR”)) = MsgBoxResult.Yes Then
Cursor.Current = Cursors.WaitCursor
CNN.Open()
SDA_CUENTA.Fill(DST_CUENTA)
BDS_CUENTA.DataSource = DST_CUENTA.Tables(0)
DGV_CUENTA.DataSource = BDS_CUENTA
SDA_CUENTA.Update(DST_CUENTA, “TBL_CUENTA”)
CNN.Close()
Cursor.Current = Cursors.Arrow
MsgBox(“DATOS ALMACENADOS EXITOSAMENTE”, MsgBoxStyle.Information, “ALMACENAMIENTO EXITOSO”)
End If
ERROR
Desbordamiento de SqlDateTime. Debe estar entre 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 PM.
Hola David,
Mira a ver si esta informacion puede ayudarte.
http://msmvps.com/blogs/peplluis/archive/2011/04/27/update-me-devuelve-error-con-la-fecha-del-dgv.aspx
Saludos,
Pep Lluis,
saludos
cuando le doy actualizar me da el siguiente error
Update requires a valid InsertCommand when passed DataRow collection with new rows.
Esta muy bueno me sirvio muchisimo
a partir de este puedo sacar otras cosas
Hola, a mi tambien me sale el sig error ‘La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave, ya defini la clave primaria pero el error persiste y no se q hacer….gracias…
sera que me podian ayudar,,,,
1)quiero saber si puedo obtener si una celda esta vacia..
2)editar las celas.. pero al mismo tiempo hacer un update y que las filas que he insertado que me haga un inter into TableName
le agradeceria de antemano
1 actualizar las celdas de la gilla pero que me haga un insert y un update
gracias de antemano si me podrian ayudar
Alguien me Puede Ayudar.. el siguiente.. error.
Error de sintaxis en la instrucción INSERT INTO.
Buen dia
soy nuevo en esto, mi pregunta es si debo llamar a la pk de la tabla en el selct para que el COMMANDBUILDER funcione ?
Buen dia
EL codigo me arroja el siguiente error
La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave.
Pero en la consulta SQL llamo a la PK de mi tabla, y mi tabla is tiene definida una PK, que puedo hacer ahi?
Buen Dia Ricardo,
En este caso te esta avisando de que necesitas una clave primaria.
Para ganar agilidad, si te parece pasamos esta conversación a los foros, o intenta contactarme directamente a través de la opción “Contact”.
Saludos,
PepLluis,
Me sirvio muchisimo el codigo con el que empezo este articulo
Gracias por subirlo a la red
Saludos
Buenas! Una consulta, si quisiera insertar si no existe o actualizar si si, desde una datagridview, cual sería el metodo?
Siempre haciendolo desde el mismo botón.
Serviria borrar todos los datos haciendo un DROP TABLE de la tabla con ese ID y volviendo a cargar todos los datos nuevamente?
Muchas Gracias! Saludos!
Hola Pepe Luis, tengo el mismo dilema, que Marcelo (September 3, 2013 at 10:00 am) con el error:
“La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave” y al cual le pediste que te contactará por la opción “contact”. Por ello recurro a este email.
Soy Víctor, saludos y gracias de antemano
Hola Victor,
Debes comprobar que la tabla en cuestión tenga definida una clave primaria.
Saludos,