none
Guardar todos los datos de un datagridview en una base de datos RRS feed

  • Pregunta

  • Hola amigos programadores

    Intento recorrer todas las filas e ir cargando pero me tirar un error.

    que algo de intervalo negativo 

    les anexo el código 

    Saludos

    Dim Cabecera As Integer = vVentaCabeceraID
            Dim articulo As String
            Dim Cantidad As Integer
            Dim Precio As Integer
            Dim importe As Integer
    
    
            For i As Integer = 0 To dgvDetalle.Rows.Count = -2
                'dgvDetalle.Rows.Add(txtItems.Text, txtPrecio.Text, txtCantidad.Text, vImporteDetalle)
                Cabecera = dgvDetalle.Item(1, i).Value
                articulo = dgvDetalle.Item(2, i).Value
                Cantidad = dgvDetalle.Item(3, i).Value
                Precio = dgvDetalle.Item(4, i).Value
                importe = dgvDetalle.Item(5, i).Value
    
                EjecutarSQL("Insert into DetalleHistorial values(@1,@2,@3,@4,@5)", Transac, articulo, Cantidad, Precio, importe)
            Next


    martes, 3 de marzo de 2020 16:58

Todas las respuestas

  • Mira a ver si es que has contado mal las columnas, y estás pensando que van de 1 a 5 cuando en realidad van de 0 a 4. En este caso te daría el error al acceder al Item(5,i). Comprueba con el debugger si es precisamente esa la línea en la que te da el error, lo cual confirmaría que el problema es ese.
    martes, 3 de marzo de 2020 20:43
  • Que tal, he hecho como me comentaste. 

            Dim Cabecera As Integer = vVentaCabeceraID
            Dim articulo As String
            Dim Cantidad As Integer
            Dim Precio As Integer
            Dim importe As Integer
    
    
            For i As Integer = 0 To dgvDetalle.Rows.Count = -2
                
    
                Cabecera = dgvDetalle.Item(0, i).Value
                articulo = dgvDetalle.Item(1, i).Value
                Cantidad = dgvDetalle.Item(2, i).Value
                Precio = dgvDetalle.Item(3, i).Value
                importe = dgvDetalle.Item(4, i).Value
    
                EjecutarSQL("Insert into DetalleHistorial values(@1,@2,@3,@4,@5)", Transac, Cabecera, articulo, Cantidad, Precio, importe)
            Next
            ConfirmarTransaccion(Transac)
            LimpiarForm()
           
            ActualizarDatagrid()
        End Sub

    Lo que ahora sucede es que, pareciera ser que esta contando mal las ubicaciones de los campos, porque en la base de datos están ubicados así los campos: 

    DetalleHistorialID

    CabeceraHistorialID

    ProductoID

    Cantidad

    Precio

    SubTotal

    y el visual basic carga de la siguiente manera:  EjecutarSQL("Insert into DetalleHistorial values(@1,@2,@3,@4,@5)", Transac, Cabecera, articulo, Cantidad, Precio, importe)

    El transac seria el código autonumerico de la tabla

    El error es que el campo articulo me dice que no puede ingresar porque no es de tipo Integer y en la base de datos ese campo esta como tipo varchar(max).

    SALUDOS



    • Editado Negro_Maruco miércoles, 4 de marzo de 2020 12:48
    • Propuesto como respuesta Pablo Rubio miércoles, 4 de marzo de 2020 17:52
    miércoles, 4 de marzo de 2020 12:45
  • Que tal, he hecho como me comentaste. 

    No, no te dije que hicieras eso. Te dije que primero lo comprobases con el debugger y despues de comprobar cuales eran realmente los numeros de columna que en tu grid se corresponden con las columnas que estas usando en la base de datos, entonces pusieras esos numeros correctos en los Item.

    No se trata de hacerlo a ciegas: "vamos a probar a cambiar los numeros y poner otros a lo loco, a ver si por casualidad graba bien". Se trata de pararse con el debugger, usarlo para examinar en tiempo de ejecucion que es lo que hay en cada posicion, y entonces poner los indices que hayamos visto que verdaderamente corresponden con cada uno de los campos.

    miércoles, 4 de marzo de 2020 14:18
  • Quería comentarte que ya he solucionado de la siguiente manera.

    Sub IngresarDetalle()

            Dim Cabecera As String
            Dim articulo As String
            Dim Cantidad As Integer
            Dim Precio As Integer
            Dim importe As Integer

            For i As Integer = 0 To dgvDetalle.Rows.Count - 1

                vVentaCabeceraID = TraerValor("select max(CabeceraHistorialID) from HistorialCabecera", Transac)

                Cabecera = vVentaCabeceraID
                articulo = dgvDetalle.Item(0, i).Value
                Cantidad = dgvDetalle.Item(1, i).Value
                Precio = dgvDetalle.Item(2, i).Value
                importe = dgvDetalle.Item(3, i).Value

                EjecutarSQL("insert into DetalleHistorial values(@1,@2,@3,@4,@5)", Transac, Cabecera, articulo, Cantidad, Precio, importe)

            Next
        End Sub

      
    jueves, 23 de abril de 2020 16:48