Actualizar una Tabla de una BD SQL utilizando un DataGridView

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

27 Replies to “Actualizar una Tabla de una BD SQL utilizando un DataGridView”

  1. 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.

  2. 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.

  3. 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

  4. 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,

  5. 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!!!

  6. 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,

  7. 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

  8. 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….

  9. 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,

  10. 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

  11. 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,

  12. 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.

  13. saludos

    cuando le doy actualizar me da el siguiente error

    Update requires a valid InsertCommand when passed DataRow collection with new rows.

  14. 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…

  15. 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

  16. 1 actualizar las celdas de la gilla pero que me haga un insert y un update

    gracias de antemano si me podrian ayudar

  17. 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 ?

  18. 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?

  19. 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,

  20. 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!

  21. 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

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.