none
Cómo recorrer un datagridview para guardar en una base de datos RRS feed

  • Pregunta

  • Estoy haciendo un sustema en el cual, por medio de un botón muestro ciertos datos de una tabla(Zn) eb un GDV y esos datos junto con otros los quiero guardar en otra tabla(Requerimientos), lo que quiero saber es como recorrer el dgv para que cheque primero si en la tabla requerimientos no existen los datos del gdv si existen no los guarda y si no existen que permita guardarlos
    miércoles, 5 de mayo de 2010 15:58

Respuestas

  • hola

    podrias hacer algo como esto

     

    Private Sun btnGuardar_Click(...)

    Using cnn = New SqlConnection("<nonnection string>")
     
        cnn.Open()
     
        Dim sql As String = "INSERT INTO Requerimientos (campo1, campo2) VALUES (@param1, @param2)"
        Dim command As New SqlCommand(sql, cnn)
     
        For Each row As DataGridViewRow In DataGridview1.Rows

            If Exist(CInt(row.Cells("nombrecolumna1"))) Then
                MessageBox.Show("Existe el registro")
                Continue For
            End If
           
            command.Parameters.Clear()
            command.Parameters.AddWithValue("@param1", CInt(row.Cells("nombrecolumna1")))
            command.Parameters.AddWithValue("@param2",  CStr(row.Cells("nombrecolumna2")))

            command.ExecuteNonQuery()
          
        Next
      
    End Using

    End Sub

    Private Function Exist(int id) As Boolean

        Using cnn = New SqlConnection("<nonnection string>")
         
            cnn.Open()
         
            Dim sql As String = "SELECT Count(*) Requerimientos WHERE id = @id)"
            Dim command As New SqlCommand(sql, cnn)
         
            command.Parameters.AddWithValue("@id", id)

            Dim i As Integer = CInt(command.ExecuteScalar())
           
            if i =0 Then
                Return False
            Else
                Return True
            End If
          
        End Using

    End Function

     

    si necesitas mas ejemplos, aqui en estos link lo explcio mejor, al final esta el codigo para descargar

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD


    ADO.NET Parte 3 Actualizaci ó n Informaci ó n Sql Server

    ADO.NET - Parte 1 - Recuperar Informaci ó n Sql Server

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Propuesto como respuesta Leandro TuttiniMVP miércoles, 5 de mayo de 2010 18:36
    • Marcado como respuesta marpao jueves, 13 de mayo de 2010 13:46
    miércoles, 5 de mayo de 2010 18:35
  • "marpao" escribió:

    > no son identicas, de las tablas, de la tabla zn solo uso 3 campos

    Imagina que en la tabla ZN tienes los siguientes campos:

         Campo1, Campo2, Campo3, Campo4, Campo5, Campo6

    Y en la tabla Requerimientos, tienes éstos otros:

         Campo1, Campo3, Campo5, Campo287, Campo2938

    Obviamente los campos comunes serían Campo1, Campo3 y Campo5. ¿OK?

    Si el objeto DataGridView se encuentra enlazado a un objeto DataTable, tienes que configurar un adaptador de datos para pasarle el objeto DataTable, y la tabla Requerimientos únicamente se actualizará automáticamente con los datos de los campos comunes, sin necesidad de recorrer fila a fila el control DataGridView.

    Si usas una base de datos Microsoft Access, más o menos actuarías de la siguiente manera:

            ' Configuramos un objeto DataAdapter con la tabla de destino.
            '
            Using cnn As New OleDbConnection( _
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=C:\Mis documentos\Bd1.mdb;")

                Try
                    ' Seleccionamos únicamente los campos comunes a ambas tablas.
                    '
                    Dim sql As String = "SELECT Campo1, Campo3, Campo5 FROM Requerimientos"

                    Dim da As New OleDbDataAdapter(sql, cnn)

                    Dim cb As New OleDbCommandBuilder(da)

                    With da
                        .InsertCommand = cb.GetInsertCommand
                        .DeleteCommand = cb.GetDeleteCommand
                        .UpdateCommand = cb.GetUpdateCommand
                    End With

                    ' Referenciamos el objeto DataTable enlazado con el control DataGridView.
                    '
                    Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)

                    ' Actualizamos la tabla
                    '
                    Dim n As Integer = da.Update(dt)

                    ' Número de registros afectados.
                    '
                    MessageBox.Show(CStr(n))

                Catch ex As Exception
                    MessageBox.Show(ex.Message)

                End Try

            End Using

    ¿Que el control DataGridView toma datos de 28 tablas diferentes? Pues utilizarías tantos adaptadores de datos como tablas individuales desees actualizar. ¡Fíjate que fácil! :-)

     


    Enrique Martínez [MS MVP - VB]
    miércoles, 5 de mayo de 2010 18:44
    Moderador

Todas las respuestas

  • podria ser algo como esto

    Using cnn = New SqlConnection("<nonnection string>")
      
        cnn.Open()
      
        Dim sql As String = "INSERT INTO Requerimientos (campo1, campo2) VALUES (@param1, @param2)"
        Dim command As New SqlCommand(sql, cnn)
      
        For Each row As DataGridViewRow In DataGridview1.Rows

            command.Parameters.Clear()
            command.Parameters.AddWithValue("@param1", CStr(row.Cells("nombrecolumna1")))
            command.Parameters.AddWithValue("@param2",  CInt(row.Cells("nombrecolumna2")))

            command.ExecuteNonQuery()
           
        Next
       
    End Using

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 5 de mayo de 2010 16:04
  • Hola:

    Una pregunta: ¿las tablas Zn y Requerimientos tienen la misma estructura de campos? ¿Son idénticas?

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    miércoles, 5 de mayo de 2010 16:17
    Moderador
  • Hola, no son identicas, de las tablas, de la tabla zn solo uso 3 campos
    miércoles, 5 de mayo de 2010 17:25
  • pero eso va a guardar tooooodos los datos del gridview, no solo una fila vdd??
    miércoles, 5 de mayo de 2010 17:27
  • hola

    cuando dices "no solo una fila vdd" que seria vdd ? ahi me perdi

     

    la grilla que usas es el datagridview o el gridview, ojo porque son distintas, una implica un desarrollo winforms, y la otra uno web, tu aplicacion es winforms ?

     

    en realdiad como expla planteado en el ejemplo inserta todas las filas quee sten en la grilla, no habia detalladso condicion para insertar pro eso puse un ejemplo general, queda de tu parte adaptarlo a las necesidades

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 5 de mayo de 2010 17:47
  • aaa, vdd significa verdad, perdon, y estoy trabajando con datagridview para las winform, y pues lo que busco es que valide cada renglon con todos sus campos,  como hago para validar que los datos de un renglon no se encuentren agregados, o sea que al presionar el boton guardar valide que si existe en la tabla muestre un msgbox de que ya existe, y si no existe que lo guarde, pero que valide renglon por renglon del datagridview
    miércoles, 5 de mayo de 2010 18:24
  • hola

    podrias hacer algo como esto

     

    Private Sun btnGuardar_Click(...)

    Using cnn = New SqlConnection("<nonnection string>")
     
        cnn.Open()
     
        Dim sql As String = "INSERT INTO Requerimientos (campo1, campo2) VALUES (@param1, @param2)"
        Dim command As New SqlCommand(sql, cnn)
     
        For Each row As DataGridViewRow In DataGridview1.Rows

            If Exist(CInt(row.Cells("nombrecolumna1"))) Then
                MessageBox.Show("Existe el registro")
                Continue For
            End If
           
            command.Parameters.Clear()
            command.Parameters.AddWithValue("@param1", CInt(row.Cells("nombrecolumna1")))
            command.Parameters.AddWithValue("@param2",  CStr(row.Cells("nombrecolumna2")))

            command.ExecuteNonQuery()
          
        Next
      
    End Using

    End Sub

    Private Function Exist(int id) As Boolean

        Using cnn = New SqlConnection("<nonnection string>")
         
            cnn.Open()
         
            Dim sql As String = "SELECT Count(*) Requerimientos WHERE id = @id)"
            Dim command As New SqlCommand(sql, cnn)
         
            command.Parameters.AddWithValue("@id", id)

            Dim i As Integer = CInt(command.ExecuteScalar())
           
            if i =0 Then
                Return False
            Else
                Return True
            End If
          
        End Using

    End Function

     

    si necesitas mas ejemplos, aqui en estos link lo explcio mejor, al final esta el codigo para descargar

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD


    ADO.NET Parte 3 Actualizaci ó n Informaci ó n Sql Server

    ADO.NET - Parte 1 - Recuperar Informaci ó n Sql Server

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Propuesto como respuesta Leandro TuttiniMVP miércoles, 5 de mayo de 2010 18:36
    • Marcado como respuesta marpao jueves, 13 de mayo de 2010 13:46
    miércoles, 5 de mayo de 2010 18:35
  • "marpao" escribió:

    > no son identicas, de las tablas, de la tabla zn solo uso 3 campos

    Imagina que en la tabla ZN tienes los siguientes campos:

         Campo1, Campo2, Campo3, Campo4, Campo5, Campo6

    Y en la tabla Requerimientos, tienes éstos otros:

         Campo1, Campo3, Campo5, Campo287, Campo2938

    Obviamente los campos comunes serían Campo1, Campo3 y Campo5. ¿OK?

    Si el objeto DataGridView se encuentra enlazado a un objeto DataTable, tienes que configurar un adaptador de datos para pasarle el objeto DataTable, y la tabla Requerimientos únicamente se actualizará automáticamente con los datos de los campos comunes, sin necesidad de recorrer fila a fila el control DataGridView.

    Si usas una base de datos Microsoft Access, más o menos actuarías de la siguiente manera:

            ' Configuramos un objeto DataAdapter con la tabla de destino.
            '
            Using cnn As New OleDbConnection( _
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=C:\Mis documentos\Bd1.mdb;")

                Try
                    ' Seleccionamos únicamente los campos comunes a ambas tablas.
                    '
                    Dim sql As String = "SELECT Campo1, Campo3, Campo5 FROM Requerimientos"

                    Dim da As New OleDbDataAdapter(sql, cnn)

                    Dim cb As New OleDbCommandBuilder(da)

                    With da
                        .InsertCommand = cb.GetInsertCommand
                        .DeleteCommand = cb.GetDeleteCommand
                        .UpdateCommand = cb.GetUpdateCommand
                    End With

                    ' Referenciamos el objeto DataTable enlazado con el control DataGridView.
                    '
                    Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)

                    ' Actualizamos la tabla
                    '
                    Dim n As Integer = da.Update(dt)

                    ' Número de registros afectados.
                    '
                    MessageBox.Show(CStr(n))

                Catch ex As Exception
                    MessageBox.Show(ex.Message)

                End Try

            End Using

    ¿Que el control DataGridView toma datos de 28 tablas diferentes? Pues utilizarías tantos adaptadores de datos como tablas individuales desees actualizar. ¡Fíjate que fácil! :-)

     


    Enrique Martínez [MS MVP - VB]
    miércoles, 5 de mayo de 2010 18:44
    Moderador