none
Guardar registros de un datagridview en sql RRS feed

  • Pregunta

  • Hola otra vez!

    Antes que nada he revisado todas las respuestas del foro a esta pregunta o similares. Pero no logro ver el error en mi codigo. Necesito ayuda.

    Tengo una grilla que se carga a partir de un contador, dos combobox y un numericupdown. El tema es que se cargan en una grilla y yo lo que quiero es guardar todos los datos que se cargan a partir de esos items.

    El siniestro id es un textbox.

    Este es mi codigo:

     Dim agregar As SqlCommand = New SqlCommand("Insert into SiniestrosVehiculos (SiniestroVe, Edad, Siniestro_id, Estado, TipoVehiculo Values ( @SiniestroVe, @Edad, @Siniestroid, @Estado, @tipoVehiculo)", conexiones)
    
            Dim fila As DataGridViewRow = New DataGridViewRow
    
            Try
                For Each fila In DataGridView1.Rows
                    agregar.Parameters.Clear()
                    agregar.Parameters.AddWithValue("@Siniestroid", TxtSiniestro.Text)
                    agregar.Parameters.AddWithValue("@SiniestroVe", CInt(fila.Cells("Número de involucrados").Value))
                    agregar.Parameters.AddWithValue("@tipoVehiculo", CStr(fila.Cells("Tipo de Vehículo").Value))
                    agregar.Parameters.AddWithValue("@Edad", CInt(fila.Cells("Edad").Value))
                    agregar.Parameters.AddWithValue("@Estado", CStr(fila.Cells("Estado del Conductor").Value))
    
                    agregar.ExecuteNonQuery()
                Next
                MsgBox("Datos guardados correctamente")
            Catch ex As Exception
                MsgBox("Error al guardar")
            End Try
    
    
            conexiones.Close()

    Entra al try y despues de agregar.parameters.addwithvalue(...."Numero de involucrados"

    salta al catch.

    Ya no se que hacer.

    Gracias de antemano


    Ileana Bedini

    jueves, 24 de marzo de 2016 19:16

Respuestas

  • Hola,

    Como dice Emma, el nombre que tiene un StoredProcedure debe ser el mismo cuando lo llamas en el SQLCommand.

    No obstante, me tomé la libertad de crearte un ejemplo, como sabes al ingresar cierta cantidad de registros al mismo tiempo, este puede ocasionar problemas.

    > Si tengo 20 registros en mi DataGridView1, y me sale un error en la fila 10?, los  9 registros primeros ya están registrados en la Base de datos, como haces para registrar ahora los 11 restantes. Por eso te recomiendo usar Transacciones, para que esto no te pueda ocurrir.

    1).- Mis campos y mi StoreProcedure

    Es casi la misma consulta que tu realizas, la diferencia es que yo uso EXISTS para saber si ya tengo ese dato en mi BD, al último hago un select* from para obtener registros y no tengo datos.

    2).- Mi DGV

    3).- Al dar click, a mi botón

    Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click Dim conexiones As SqlConnection Dim agregar As SqlCommand Dim tr As SqlTransaction Dim correcto As Integer conexiones = New SqlConnection("Aquí pongo mi cadena de conexión") 'Iniciamos la transacción conexiones.Open() tr = conexiones.BeginTransaction agregar = New SqlCommand("SP_XAMPLE", conexiones, tr) agregar.CommandType = CommandType.StoredProcedure Try For Each fila As DataGridViewRow In DataGridView1.Rows agregar.Parameters.Clear() agregar.Parameters.AddWithValue("@NOMBRE", Convert.ToString(fila.Cells(0).Value)) agregar.Parameters.AddWithValue("@STOCK", Convert.ToString(fila.Cells(1).Value)) correcto = agregar.ExecuteNonQuery() 'Si correcto es 0, es porque no pudo registrar, cancelamos la transacción

    If correcto = 0 Then tr.Rollback() End If Next 'Transacción correcta

    tr.Commit() MessageBox.Show("Los datos se guardaron correctamente.") Catch ex As Exception MessageBox.Show("Se produjo una excepción : " + ex.Message) tr.Rollback() End Try End Sub

    Resultado :

    Consulto mi BD (select * from) y ya tengo mis datos registrados, si cambio los valores, se actualizan.

    Espero que te sirva de guía.

    Saludos.


    JC NaupaCrispín

    jueves, 24 de marzo de 2016 21:24

Todas las respuestas

  • Hola,

    A simple vista le falta un ")" a tu consulta, te aconsejaría uses StoredProcedures para que tu código sea más óptimo, eso queda a decisión tuya.

     Insert into SiniestrosVehiculos (SiniestroVe, Edad, Siniestro_id, Estado, TipoVehiculo ) Values ( @SiniestroVe, @Edad, @Siniestroid, @Estado, @tipoVehiculo)

    Algo así :

    CREATE PROCEDURE SP_REGISTRAR_SINIESTRO
     @SiniestroVe TIPO,
     @Edad TIPO,
     @Siniestroid TIPO,
     @Estado TIPO,
     @tipoVehiculo TIPO
     AS
       Insert into SiniestrosVehiculos (SiniestroVe, Edad, Siniestro_id, Estado, TipoVehiculo) 
       Values ( @SiniestroVe, @Edad, @Siniestroid, @Estado, @tipoVehiculo)
     GO
    


    Y solo llamarías el SP con el nombre.

    Dim agregar As SqlCommand = New SqlCommand("SP_REGISTRAR_SINIESTRO", conexiones)
    agregar.CommandType = CommandType.StoredProcedure

    Y veo que creas una nueva fila ???

      Dim fila As DataGridViewRow = New DataGridViewRow
    
            Try
                For Each fila In DataGridView1.Rows

    Si lo que quieres es recorrer las filas de tu DGV

              For Each fila As DataGridViewRow In DataGridView1.Rows
    
                    agregar.Parameters.AddWithValue("@Siniestroid", TxtSiniestro.Text)
                    agregar.Parameters.AddWithValue("@SiniestroVe", CInt(fila.Cells("Número de involucrados").Value))
                    agregar.Parameters.AddWithValue("@tipoVehiculo", CStr(fila.Cells("Tipo de Vehículo").Value))
                    agregar.Parameters.AddWithValue("@Edad", CInt(fila.Cells("Edad").Value))
                    agregar.Parameters.AddWithValue("@Estado", CStr(fila.Cells("Estado del Conductor").Value))
    
                    'Ejecutas
                    agregar.ExecuteNonQuery()
                    'limpias parámetros
                    agregar.Parameters.Clear()
                Next

    Si esto no te ayuda, deberías poner el ERROR que te da en el CATCH.

    Saludos.


    JC NaupaCrispín

    jueves, 24 de marzo de 2016 19:33
  • Joel gracias por tu rápida respuesta.

    Antes que nada, el procedimiento almacenado en la base de datos lo tengo, pero no logro que guarde los datos de la grilla si lo hago como me dices en tu respuesta.

    Por otro lado el error que me lleva al catch es que dice que la columna número de involucrados no existe, cuando obviamente esta, intenté ponerle el nombre columna1, pero tampoco me deja hacerlo. 

    Este es mi storedprocedure

    Create procedure SiniestrosVehiculosGuardar
    	(@SiniestroVe int,
    	 @Siniestroid int,
    	 @tipoVehiculo varchar(20),
    	 @Estado varchar(20),
    	 @Edad int
    	)
           as
        SET NOCOUNT ON
     if (Select count(1) from SiniestrosVehiculos
    	where SiniestroVe =@SiniestroVe and Siniestro_id= @Siniestroid)>0
    
     /*Update*/
    
      begin
        update SiniestrosVehiculos set tipoVehiculo=@tipoVehiculo, Estado=@Estado, Edad=@Edad
    	where SiniestroVe =@SiniestroVe and Siniestro_id= @Siniestroid
      end
    
     /*Insert*/
    
      begin
        Insert into SiniestrosVehiculos(SiniestroVe, Siniestro_id, tipoVehiculo, Estado, Edad)
    	 values(@SiniestroVe, @Siniestroid, @tipoVehiculo, @Estado, @Edad)
      end
    
    Go

    Y mi codigo en vb.net quedo así

     Dim agregar As SqlCommand = New SqlCommand("SP_SiniestrosVehiculosGuardar", conexiones)
            agregar.CommandType = CommandType.StoredProcedure
    
                conexiones.Close()
    Pero no guarda los datos de la grilla.


    Ileana Bedini

    jueves, 24 de marzo de 2016 20:16
  • Hola Ileana:

    Veo que el nombre del stored procedure es "SiniestrosVehiculosGuardar" y los estás llamando como "SP_SiniestrosVehiculosGuardar", mira de cambiarlo.

    Un saludo.

    Gemma

    jueves, 24 de marzo de 2016 20:39
  • Hola,

    Como dice Emma, el nombre que tiene un StoredProcedure debe ser el mismo cuando lo llamas en el SQLCommand.

    No obstante, me tomé la libertad de crearte un ejemplo, como sabes al ingresar cierta cantidad de registros al mismo tiempo, este puede ocasionar problemas.

    > Si tengo 20 registros en mi DataGridView1, y me sale un error en la fila 10?, los  9 registros primeros ya están registrados en la Base de datos, como haces para registrar ahora los 11 restantes. Por eso te recomiendo usar Transacciones, para que esto no te pueda ocurrir.

    1).- Mis campos y mi StoreProcedure

    Es casi la misma consulta que tu realizas, la diferencia es que yo uso EXISTS para saber si ya tengo ese dato en mi BD, al último hago un select* from para obtener registros y no tengo datos.

    2).- Mi DGV

    3).- Al dar click, a mi botón

    Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click Dim conexiones As SqlConnection Dim agregar As SqlCommand Dim tr As SqlTransaction Dim correcto As Integer conexiones = New SqlConnection("Aquí pongo mi cadena de conexión") 'Iniciamos la transacción conexiones.Open() tr = conexiones.BeginTransaction agregar = New SqlCommand("SP_XAMPLE", conexiones, tr) agregar.CommandType = CommandType.StoredProcedure Try For Each fila As DataGridViewRow In DataGridView1.Rows agregar.Parameters.Clear() agregar.Parameters.AddWithValue("@NOMBRE", Convert.ToString(fila.Cells(0).Value)) agregar.Parameters.AddWithValue("@STOCK", Convert.ToString(fila.Cells(1).Value)) correcto = agregar.ExecuteNonQuery() 'Si correcto es 0, es porque no pudo registrar, cancelamos la transacción

    If correcto = 0 Then tr.Rollback() End If Next 'Transacción correcta

    tr.Commit() MessageBox.Show("Los datos se guardaron correctamente.") Catch ex As Exception MessageBox.Show("Se produjo una excepción : " + ex.Message) tr.Rollback() End Try End Sub

    Resultado :

    Consulto mi BD (select * from) y ya tengo mis datos registrados, si cambio los valores, se actualizan.

    Espero que te sirva de guía.

    Saludos.


    JC NaupaCrispín

    jueves, 24 de marzo de 2016 21:24
  • Gracias Gemma por tu respuesta. Le cambie el nombre

    Ileana Bedini

    viernes, 25 de marzo de 2016 15:55
  • Joel, muchisimas gracias por tu respuesta, perdon por no responder yo antes es que no he podido hacerlo.

    Gracias por el trabajo que te has tomado. Te cuento que si bien no logro que guarde por algun error en la base de datos, que tengo que ver, estoy segura que es el codigo que estoy buscando.

    Nuevamente muchas gracias!!!!


    Ileana Bedini

    viernes, 25 de marzo de 2016 15:58