none
dataGridview y guardar datos en vb.net RRS feed

  • Pregunta

  • Saludos camaradas tengo una problematica necesito recorrer un datagridview y guardar los campos en una base de datos de sql, pero mi problematica es que la base de datos ya viene con registros osea lo q tengo q hacer es un update basandome con el rut del alumno

    Registro que muestra la grilla

    Rut Enrolamiento Nombre Institucion Ciudad Sede Horario %Acumulado %
    5.669.153-0 5669153 Lino Octavio Instituto  Conce San Martín  100 hrs. 12,58 12.58 %
    5.966.736-2 5966736 Luis Raul  Instituto  Conce San Martín  200 hrs. 20,9 10.45 %
    6.665.615-1 6665615 Paz Lucia  Instituto  Conce San Martín  200 hrs. 0 0.00 %

    ahi solamente tengo que guardar el % acumulado y % por alumno siendo el rut la condicion

    Saludos

    Cordiales

    viernes, 23 de agosto de 2013 14:28

Respuestas

  • Gracias a todos por responder lo resolvi de la siguiente manera

    Dejo Codigo fuente

    Imports System.IO
    Imports System.Text
    Imports System.Data.SqlClient
    Imports System.Data.OleDb
    Public Class Form1
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim openFD As New OpenFileDialog()
            With openFD
                .Title = "Seleccionar archivos"
                .Filter = "Todos los archivos (*.xls)|*.xls"
                .Multiselect = False
                .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                If .ShowDialog = Windows.Forms.DialogResult.OK Then
                    TextPathExcel.Text = .FileName
                End If
            End With
    
    
        End Sub
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim dt As New DataTable
            Try
                Dim strconn As String
                strconn = "Provider=Microsoft.Jet.Oledb.4.0; data source= " + TextPathExcel.Text + ";Extended properties=""Excel 8.0;hdr=yes;imex=1"""
                Dim mconn As New OleDbConnection(strconn)
                Dim ad As New OleDbDataAdapter("Select * from [" & TextHoja.Text & "$]", mconn)
                mconn.Open()
                ad.Fill(dt)
                mconn.Close()
                Me.dvgGr.DataSource = dt
            Catch ex As OleDbException
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    
        Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGuardar.Click
            
    
                Dim Fecha As DateTime
                Dim oDataRow As DataRow = Nothing
    
    
                Dim dsRegistros As DataSet = New DataSet("dsPrincipal")
                dsRegistros.Tables.Add("TB_Registro")
    
                dsRegistros.Tables(0).Columns.Add("Rut", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaAcumulada", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaPresencial", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("Fecha", System.Type.GetType("System.String"))
    
                For Each dvg As DataGridViewRow In dvgGr.Rows
    
                    oDataRow = dsRegistros.Tables(0).NewRow()
    
    
                    oDataRow("Rut") = dvg.Cells(0).Value.ToString
                    oDataRow("AsistenciaAcumulada") = dvg.Cells(7).Value
                    oDataRow("AsistenciaPresencial") = dvg.Cells(8).Value
                    Fecha = DateTime.Now.ToString("d")
                    Fecha = Fecha.AddDays(-1)
                    oDataRow("Fecha") = Fecha
    
    
                    dsRegistros.Tables(0).Rows.Add(oDataRow)
    
    
                Next
                Dim ErrorCode As Integer
    
                ErrorCode = business.Grabar.GrabaRegistros(dsRegistros)
    
            
        End Sub
    
    
    End Class
    

    Clase Grabar

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Configuration
    Imports Microsoft.ApplicationBlocks.Data
    Imports System
    
    Namespace business
        Public Class Grabar
    
            Public Shared Function GrabaRegistros(ByVal dsDatos As DataSet) As Integer
    
                Dim connection As New SqlConnection
                Dim dsData As New DataSet
                Dim iRowAffected As Integer
                Try
                    Try
                        connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("Connecion").ToString()
    
                    Catch ex As Exception
                        Throw New Exception("The connection with the database can´t be established")
                        Exit Function
                    End Try
    
    
                    Dim arParms() As SqlParameter = New SqlParameter(6) {}
                    Dim Rut As String
                    Dim AsistenciaAcumulada As String
                    Dim AsistenciaPresencial As String
                    Dim Fecha As String
    
    
    
                    For Each oDataRow As DataRow In dsDatos.Tables(0).Rows
                        Rut = CStr(oDataRow("Rut"))
                        AsistenciaAcumulada = CStr(oDataRow("AsistenciaAcumulada"))
                        AsistenciaPresencial = oDataRow("AsistenciaPresencial")
                        Fecha = CStr(oDataRow("Fecha"))
    
    
                        arParms(0) = New SqlParameter("@Rut", SqlDbType.VarChar)
                        arParms(0).Value = Rut
    
                        arParms(1) = New SqlParameter("@AsistenciaAcumulada", SqlDbType.Float)
                        arParms(1).Value = AsistenciaAcumulada
    
                        arParms(2) = New SqlParameter("@AsistenciaPresencial", SqlDbType.Float)
                        arParms(2).Value = AsistenciaPresencial
    
                        arParms(3) = New SqlParameter("@Fecha", SqlDbType.VarChar)
                        arParms(3).Value = Fecha
    
    
                        iRowAffected = SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, "[sp_Listar_Volcador_Grabar]", arParms)
    
    
                        'If iRowAffected < 0 Then
                        '    iRowAffected = -1
                        '    Exit For
                        'End If
                    Next
    
                    Return -1
                Catch ex As Exception
                    Dim errMessage As String = ""
                    Dim tempException As Exception = ex
    
                    While (Not tempException Is Nothing)
                        errMessage += tempException.Message + Environment.NewLine
                        tempException = tempException.InnerException
                    End While
                    Throw New Exception(errMessage)
    
                Finally
                    If Not connection Is Nothing Then
                        CType(connection, IDisposable).Dispose()
                    End If
                End Try
    
    
            End Function
        End Class
    End Namespace

    Imports System.Data.OleDb
    Public Class Excel
        Public Class FormImpExcel
            Dim dt As New DataTable
        End Class
    End Class

    Espero que les sirva

    Saludos

    LatinWater

    • Marcado como respuesta LatinWater lunes, 26 de agosto de 2013 13:37
    lunes, 26 de agosto de 2013 13:37

Todas las respuestas

  • Como estableces el datasource del dgv? Si usas un datatable puedes usar un dataadapter y hacer un update del mismo pasándole como argumento el datatable usado

    puedes seguir este tutorial

    Cómo: Enlazar datos al control DataGridView de formularios Windows Forms


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    viernes, 23 de agosto de 2013 15:04
  • gracias por responder sergio

    Resulta q la carga del datagridview lo hago mediante un excel

    formule este codigo pero me frene en esta parte nose como puedo llamar a los registros q me muestra una vez acargada la datagrid

            Try
                Dim oDataRow As DataRow = Nothing
                Dim Rut As String
                Dim AsistAcumu As String
                Dim AsisPresen As String
                Dim Fecha As String
    
    
                Dim dsRegistros As DataSet = New DataSet("dsPrincipal")
                dsRegistros.Tables.Add("TB_Registro")
    
                dsRegistros.Tables(0).Columns.Add("Rut", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaAcumulada", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaPresencial", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("Fecha", System.Type.GetType("System.String"))
    
                For Each dvgGr As DataGridView In dvgGr.Rows
                    oDataRow = dsRegistros.Tables(0).NewRow()
    
                    oDataRow("Rut") = TryCast(dvgGr.FindControl(""), Label).Text
                Next
            Catch ex As Exception
    
            End Try
    oDataRow("Rut") = TryCast(dvgGr.FindControl(""), Label).Text

    ya q aca cuando lo hago mediante asp.net le designo el nombre pre-vio, pero aca nose como proceder ya q los datos los cargo desde excel? y me sale q el

    FindControl no un miembro de datagridview


    Saludos Cordiales


    • Editado LatinWater viernes, 23 de agosto de 2013 15:17 Falto agregar informacion
    viernes, 23 de agosto de 2013 15:14
  • Resolvi el recorido de la grilla de la siguiente forma pero ahora me sale el siguiente error

            Try
                Dim Fecha As DateTime
                Dim oDataRow As DataRow = Nothing
    
    
                Dim dsRegistros As DataSet = New DataSet("dsPrincipal")
                dsRegistros.Tables.Add("TB_Registro")
    
                dsRegistros.Tables(0).Columns.Add("Rut", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaAcumulada", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaPresencial", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("Fecha", System.Type.GetType("System.String"))
    
                For Each dvg As DataGridViewRow In dvgGr.Rows
                    oDataRow = dsRegistros.Tables(0).NewRow()
    
                    oDataRow("Rut") = dvg.Cells(0).Value.ToString
                    oDataRow("AsistenciaAcumulada") = dvg.Cells(7).Value
                    oDataRow("AsistenciaPresencial") = dvg.Cells(8).Value
                    Fecha = DateTime.Now.ToString("d")
                    Fecha = Fecha.AddDays(-1)
                    oDataRow("Fecha") = Fecha
    
                    dsRegistros.Tables(0).Rows.Add(oDataRow)
                Next
                Dim ErrorCode As Integer
    
                ErrorCode = business.Grabar.GrabaRegistros(dsRegistros)
    
            Catch ex As Exception
    
            End Try


    el datagrid me ingresa una fila demas a la grilla necesito ver si es posible restar esa fila para q no aparezca ya q ahi se genera el error siguiente       


    • Editado LatinWater viernes, 23 de agosto de 2013 19:44 agregue informacion
    viernes, 23 de agosto de 2013 19:30
  • hola

    un comentario, NUNCA, pero NUNCA definas un try..catch sin ahcer nada dentro del mismo, o muestras un mensaje de error o lofues a un archivo de texto, algo haces con el error, peor nucna lo dejes vacio, sino no lo definas

    ---

    de donde sale la linea

    business.Grabar.GrabaRegistros

    no validaste si ese Grabar o business has creado la instancia con New ?

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 24 de agosto de 2013 0:47
  • "LatinWater" preguntó:

    > el datagrid me ingresa una fila demas a la grilla necesito ver si
    > es posible restar esa fila para q no aparezca ya q ahi se genera
    > el error siguiente       
    >
    > Se detectó NullReferenceException
    >

    Hola:

    A esa fila de más que automáticamente te añade el control DataGridView, se le suele llamar la fila de nuevos registros. Si no deseas que te aparezcan, en el Cuadro de Propiedades o en el evento Load del formulario, ejecuta:

       DataGridView1.AllowUserToAddRows = False

    Lo que hará que el usuario NO PUEDA añadir nuevas filas al control DataGridView; tendrás que añadirlas mediante programación.

    De todas maneras, no es sumamente necesario que establezcas el valor False a la propiedad AllowUserToAddRows, porque simplemente tienes que detectar en el bucle For Each...Next si el objeto DataGridViewRow actual hace referencia o no a la fila de nuevos registros:

            For Each dvg As DataGridViewRow In dvgGr.Rows
    
                If (dvg.IsNewRow) Then
                    ' Es la fila de nuevos registros (la
                    ' última fila en blanco que aparece
                    ' en el control DataGridView).
                    '
                    ' Continuamos el bucle.
                    Continue For
    
                End If
    
                oDataRow = dsRegistros.Tables(0).NewRow()
    
                oDataRow("Rut") = dvg.Cells(0).Value.ToString
                oDataRow("AsistenciaAcumulada") = dvg.Cells(7).Value
                oDataRow("AsistenciaPresencial") = dvg.Cells(8).Value
                Fecha = DateTime.Now.ToString("d")
                Fecha = Fecha.AddDays(-1)
                oDataRow("Fecha") = Fecha
    
                dsRegistros.Tables(0).Rows.Add(oDataRow)
    
            Next

    De ésta manera podrás obtener otros errores, pero no el que dices que estás obteniendo con esa fila de más que te añade el control DataGridView. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    sábado, 24 de agosto de 2013 10:38
    Moderador
  • Gracias a todos por responder lo resolvi de la siguiente manera

    Dejo Codigo fuente

    Imports System.IO
    Imports System.Text
    Imports System.Data.SqlClient
    Imports System.Data.OleDb
    Public Class Form1
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim openFD As New OpenFileDialog()
            With openFD
                .Title = "Seleccionar archivos"
                .Filter = "Todos los archivos (*.xls)|*.xls"
                .Multiselect = False
                .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                If .ShowDialog = Windows.Forms.DialogResult.OK Then
                    TextPathExcel.Text = .FileName
                End If
            End With
    
    
        End Sub
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim dt As New DataTable
            Try
                Dim strconn As String
                strconn = "Provider=Microsoft.Jet.Oledb.4.0; data source= " + TextPathExcel.Text + ";Extended properties=""Excel 8.0;hdr=yes;imex=1"""
                Dim mconn As New OleDbConnection(strconn)
                Dim ad As New OleDbDataAdapter("Select * from [" & TextHoja.Text & "$]", mconn)
                mconn.Open()
                ad.Fill(dt)
                mconn.Close()
                Me.dvgGr.DataSource = dt
            Catch ex As OleDbException
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    
        Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGuardar.Click
            
    
                Dim Fecha As DateTime
                Dim oDataRow As DataRow = Nothing
    
    
                Dim dsRegistros As DataSet = New DataSet("dsPrincipal")
                dsRegistros.Tables.Add("TB_Registro")
    
                dsRegistros.Tables(0).Columns.Add("Rut", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaAcumulada", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("AsistenciaPresencial", System.Type.GetType("System.String"))
                dsRegistros.Tables(0).Columns.Add("Fecha", System.Type.GetType("System.String"))
    
                For Each dvg As DataGridViewRow In dvgGr.Rows
    
                    oDataRow = dsRegistros.Tables(0).NewRow()
    
    
                    oDataRow("Rut") = dvg.Cells(0).Value.ToString
                    oDataRow("AsistenciaAcumulada") = dvg.Cells(7).Value
                    oDataRow("AsistenciaPresencial") = dvg.Cells(8).Value
                    Fecha = DateTime.Now.ToString("d")
                    Fecha = Fecha.AddDays(-1)
                    oDataRow("Fecha") = Fecha
    
    
                    dsRegistros.Tables(0).Rows.Add(oDataRow)
    
    
                Next
                Dim ErrorCode As Integer
    
                ErrorCode = business.Grabar.GrabaRegistros(dsRegistros)
    
            
        End Sub
    
    
    End Class
    

    Clase Grabar

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Configuration
    Imports Microsoft.ApplicationBlocks.Data
    Imports System
    
    Namespace business
        Public Class Grabar
    
            Public Shared Function GrabaRegistros(ByVal dsDatos As DataSet) As Integer
    
                Dim connection As New SqlConnection
                Dim dsData As New DataSet
                Dim iRowAffected As Integer
                Try
                    Try
                        connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("Connecion").ToString()
    
                    Catch ex As Exception
                        Throw New Exception("The connection with the database can´t be established")
                        Exit Function
                    End Try
    
    
                    Dim arParms() As SqlParameter = New SqlParameter(6) {}
                    Dim Rut As String
                    Dim AsistenciaAcumulada As String
                    Dim AsistenciaPresencial As String
                    Dim Fecha As String
    
    
    
                    For Each oDataRow As DataRow In dsDatos.Tables(0).Rows
                        Rut = CStr(oDataRow("Rut"))
                        AsistenciaAcumulada = CStr(oDataRow("AsistenciaAcumulada"))
                        AsistenciaPresencial = oDataRow("AsistenciaPresencial")
                        Fecha = CStr(oDataRow("Fecha"))
    
    
                        arParms(0) = New SqlParameter("@Rut", SqlDbType.VarChar)
                        arParms(0).Value = Rut
    
                        arParms(1) = New SqlParameter("@AsistenciaAcumulada", SqlDbType.Float)
                        arParms(1).Value = AsistenciaAcumulada
    
                        arParms(2) = New SqlParameter("@AsistenciaPresencial", SqlDbType.Float)
                        arParms(2).Value = AsistenciaPresencial
    
                        arParms(3) = New SqlParameter("@Fecha", SqlDbType.VarChar)
                        arParms(3).Value = Fecha
    
    
                        iRowAffected = SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, "[sp_Listar_Volcador_Grabar]", arParms)
    
    
                        'If iRowAffected < 0 Then
                        '    iRowAffected = -1
                        '    Exit For
                        'End If
                    Next
    
                    Return -1
                Catch ex As Exception
                    Dim errMessage As String = ""
                    Dim tempException As Exception = ex
    
                    While (Not tempException Is Nothing)
                        errMessage += tempException.Message + Environment.NewLine
                        tempException = tempException.InnerException
                    End While
                    Throw New Exception(errMessage)
    
                Finally
                    If Not connection Is Nothing Then
                        CType(connection, IDisposable).Dispose()
                    End If
                End Try
    
    
            End Function
        End Class
    End Namespace

    Imports System.Data.OleDb
    Public Class Excel
        Public Class FormImpExcel
            Dim dt As New DataTable
        End Class
    End Class

    Espero que les sirva

    Saludos

    LatinWater

    • Marcado como respuesta LatinWater lunes, 26 de agosto de 2013 13:37
    lunes, 26 de agosto de 2013 13:37
  • Oye amigo no he podido guardarlo, me podrias pasar tu proyecto, vans.punk@gmail.com  gracias, lo voy a estar intentando
    jueves, 30 de enero de 2014 16:55
  • Saludos JIvan, dejame ver tu codigo fuente y saber donde esta error.

    Saludos

    LatinWater!

    jueves, 30 de enero de 2014 19:27