none
Guardar datos de un datagridview en sql

    Pregunta

  • Hola!

    Mi consulta es la siguiente:

    Quiero guardar todos los datos de una columna de un datagridview en una columna de una tabla de SQL pero que estos datos ocupen un solo registro osea una sola celda, en este caso es los productos de una venta.

    Desde ya muchas gracias.

    viernes, 30 de septiembre de 2016 20:12

Respuestas

  • Martin12259,

    Primero debes de recuperar el valor y luego persistir:

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            
    	Dim productos As String = String.Empty
    
    	For Each row As DataGridViewRow In DataGridView2.Rows
    		productos += String.Concat(row.Cells("Column1").Value.ToString(), ",")
    	Next
    
    	Try
    		Using cn As New SqlConnection(
    			"Data Source=MARTIN-PC;Initial Catalog=BASEDATOSCOMERCIO;Integrated Security=true")
    			cn.Open()
    
    			Dim cmd As New SqlCommand("INSERT INTO Ventas2 (Productos) values (@Productos)", cn)
    
    			cmd.Parameters.AddWithValue("@Productos", productos.EndsWith(","))
    
    			cmd.ExecuteNonQuery()
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Desmarcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:23
    sábado, 1 de octubre de 2016 17:58
  • Hola,

    Creo que hay un ligero error al mandar el valor del parámetro, usarías el TrimEnd(...) y no el EndsWith(..)

    cmd.Parameters.AddWithValue("@Productos", productos.TrimEnd(","c))

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Desmarcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:23
    sábado, 1 de octubre de 2016 18:17

Todas las respuestas

  • Hola Martin12259,

    Puedes guardar los datos de una columna en un array, y por medio de Join crear una cadena con separador.

    Algo como : Los datos se guardarán como una cadena separadas por coma.

    Public Sub guardarDatos(ByVal colIndex As Integer) Try Using con As New SqlConnection("MiCadenaConexion") con.Open() 'Obtengo los valores de la columna Dim datos = DataGridView1.Rows.OfType(Of DataGridViewRow). Select(Function(x) x.Cells(colIndex).Value).ToArray 'Guardo en una variable concatenando con ',' Dim query As String = "INSERT INTO miTabla (campo) VALUES (@dato)" Dim valor As String = String.Join(",", datos) Dim cmd As New SqlCommand(query, con) cmd.Parameters.AddWithValue("@dato", valor)

    cmd.ExecuteNonQuery() 'Ejecuta la query MessageBox.Show("Registrado!!!") End Using Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub

    En este caso, mandas el índice de la columna :

    Columna1 - indice 0
    Columna2 - indice 1
    ....

    Puedes cambiarlo y mandar el nombre de la columna.

    Solo es cuestión de adaptarlo a la estructura de tu Tabla.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI


    viernes, 30 de septiembre de 2016 20:27
  • Martin12259,

    No creo que sea correcto hacer lo que intentas, no das mucho detalle del porque, sin embargo te dejo el código para que puedas contener en una variable de tipo string las filas de una columna.

    Dim valor As String =
                String.Join(",",
                            DataGridView1.Rows.Cast(Of DataGridViewRow)().
                            [Select](Function(x) x.Cells("NombreColumna").Value).ToArray())
    
    'Resultado: Producto1, Producto2, Producto3, ...


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de septiembre de 2016 20:31
  • Me podrías dar mas detalles?

    Quiero ingresar la columna productos1 en la tabla ventas en la columna productos

    Me salen errores en Function  y acá

     String.Join(",",
                            DataGridView1.Rows.Cast(Of DataGridViewRow)().

    Lo que he logrado hace ses esto, pero me guarda los productos por separado.

              With Me.Ventas
                        cmd.Parameters.AddWithValue("@Productos", row.Cells("Column1").Value)
                        .Total = txttotal.Text
                        .dtpFecha = DateTimePicker1.Value
                        .Usuario = Me.Usuarios.Nombre
                        .Insertar()
                    End With

    Estoy usando visual 2005.

    El resultado esta bien asi quiero que me quede



    viernes, 30 de septiembre de 2016 20:46
  • Hola Martin12259,

    Al parecer tienes problemas con Linq. Que framework usas , ya que está disponible desde el 3.5?

    Prueba haciéndolo de la forma convencional :

            Dim datos As New List(Of String)
    
            For Each fila As DataGridViewRow In DataGridView1.Rows
                datos.Add(CStr(fila.Cells("NombreColumna").Value))
            Next
    
            Dim products As String = String.Join(",", datos.ToArray)

    Y cuando lo insertes :

     cmd.Parameters.AddWithValue("@Productos", products)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 21:10
  • Martin12259,

    Entiendo que por la versión de .NET Framework no puedes trabajar con LinQ, entonces has lo básico: recorre las filas de la grilla:

    Dim productos As String = String.Empty
    For Each row As DataGridViewRow In DataGridView1.Rows
    	productos += String.Concat(row.Cells("NombreColumna").Value.ToString(), ",")
    Next
    
    
    cmd.Parameters.AddWithValue("@Productos", productos)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de septiembre de 2016 21:21
  • Ya casi jajaj, agrego 2 productos me hace 2 registros pero me guarda en un registro los productos repetidos por ejemplo "auto, auto" y en el otro registro "moto, moto" cuando en el datagrid agregue moto y auto.
    sábado, 1 de octubre de 2016 16:39
  • Martin12259,

    ¿Podrías mostrar el código que tienes implementado?

    Se entiende que si conviertes el valor de las filas (de una columna) en un único valor es porque sólo registrarás una fila en la tabla de base de datos, ¿por qué insertar dos filas?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 1 de octubre de 2016 17:07
  •     Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            For Each row As DataGridViewRow In DataGridView2.Rows
                Using conexion As New SqlConnection("Data Source=MARTIN-PC;Initial Catalog=BASEDATOSCOMERCIO;Integrated Security=true")
                    conexion.Open()
                    Dim cmd As New SqlCommand("Insert into Ventas2 (Productos) values (@Productos)", conexion)
                    cmd.CommandType = CommandType.Text

                    With Me.Ventas

                        Dim productos As String = String.Empty
                        For Each rows As DataGridViewRow In DataGridView2.Rows
                            productos += String.Concat(row.Cells("Column1").Value.ToString(), ",")
                        Next
                        cmd.Parameters.AddWithValue("@Productos", productos)

                              .Insertar()
                    End With

                    cmd.ExecuteNonQuery()
                    conexion.Close()
                End Using
            Next
        End Sub

    Quiero que me guarda todos los productos de la venta en un solo registro

    producto1,producto2,...

                    
    sábado, 1 de octubre de 2016 17:37
  • Martin12259,

    Primero debes de recuperar el valor y luego persistir:

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            
    	Dim productos As String = String.Empty
    
    	For Each row As DataGridViewRow In DataGridView2.Rows
    		productos += String.Concat(row.Cells("Column1").Value.ToString(), ",")
    	Next
    
    	Try
    		Using cn As New SqlConnection(
    			"Data Source=MARTIN-PC;Initial Catalog=BASEDATOSCOMERCIO;Integrated Security=true")
    			cn.Open()
    
    			Dim cmd As New SqlCommand("INSERT INTO Ventas2 (Productos) values (@Productos)", cn)
    
    			cmd.Parameters.AddWithValue("@Productos", productos.EndsWith(","))
    
    			cmd.ExecuteNonQuery()
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Desmarcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:23
    sábado, 1 de octubre de 2016 17:58
  • Pfff ahora me guarda un valor numerico.

    Hasta aqui esta bien

            For Each row As DataGridViewRow In DataGridView2.Rows
                productos += String.Concat(row.Cells("Column1").Value.ToString(), ",")
            Next

    Me asigna bien los valores a productos pero me guarda un valor numerico

    sábado, 1 de octubre de 2016 18:14
  • Hola,

    Creo que hay un ligero error al mandar el valor del parámetro, usarías el TrimEnd(...) y no el EndsWith(..)

    cmd.Parameters.AddWithValue("@Productos", productos.TrimEnd(","c))

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Desmarcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:20
    • Marcado como respuesta Federico32113 sábado, 1 de octubre de 2016 18:23
    sábado, 1 de octubre de 2016 18:17
  • Martin12259,

    Es cierto, lo escribí de memoria, el método es TrimEnd() y tiene como objetivo quitar el último caracter de coma ',' producto de la concatenación. Gracias Joel por la observación.

    sábado, 1 de octubre de 2016 18:27