none
como actualizar tabla de bd con datagridview no enlazada a bd, comparando el datagridview con la tabla y si existe que se actualize ese campo enla tabla RRS feed

  • Pregunta

  •  (EL DATAGRIDVIEW NO ESTA ENLAZADO A NINGUNA BASE DE DATOS) 

     DESEO HACER LO SIGUIENTE TODO TENGO UN  DATAGRIDVIEW Y QUE CON UN BOTON VOY LO VOY LLENANDO,CON ESOS DATOS QIERO ACTUALIZAR UNA TABLA DE MI BASE DE DATOS PERO SOLO AQUELLOS Q TENGAN EL MISMO CODIGO DE PRODUCTO QUE ESTAN EN EL DATAGRIDVIEW.

    POR ELMOMENTO ESTOY REALIZANDO LO SIGUIENTE AGREGO UNICAMENTEO 2 PRODUCTO AL DATAGRIDVIEW Y AL HACER CLIC EN EL BOTON COMPARAR ME COMPARA EL 1ER CODIGO DEL PRODUCTO QUE ESTA EN EL DATAGRIDVIEW CON EL QUE ESTA EN LA BASE DE DATOS Y EN OTRO DATAGRIDVIEW ME MUESTRA EL CODIGO QUE ACABO DE COMPARA DEMOSTRANDO QUE SI EXISTE EN LA TABLA DE LA BD EL PROBLEMA ES EL SIGIENTE QUE UNICAMENTE SOLO COMPARA EL 1ER PRODUCTO DEL DATAGRIDVIEW NO AVANZA AL SIGUIENTE PARA ESTE SER COMPARADO CON LOS QUE ESTAN EN LA BASE DE DATOS.

    AQUI LES DEJO EL CODIGO DE COMO LO TENGO TAL ME PUEDAN AYUDAR.

    RECUERDEN QUE LO QUE QIERO HACER ES LO QUE DICE EL 1ER PARRAFO Y EL 2DO PARRAFO ES PARA VER SI EL CODIGO LO LLEVO  CORRENTO O SI ESTA ACIENDO BIEN LA COMPARACION.

    Public Sub actualizar_tabla_producto() 
            Dim codigos, sqlbuscar As String 
            Dim i As Integer = 0 
            codigos = DataGridView1.CurrentRow.Cells(1).Value 
            Try 
                ' Establecemos la conexión con la base'  
                Using cnn As New SqlConnection("Data Source=BT-PC\SQLEXPRESS;Initial Catalog=ferr2013;Integrated Security=True") 
                    sqlbuscar = ("SELECT cod_producto FROM producto WHERE cod_producto ='" & codigos & "'") 
                    ' Creamos el adaptador de datos' 
                    Dim da As New SqlDataAdapter(sqlbuscar, cnn) 
                    ' Creamos un nuevo objeto DataTable' 
                    Dim dt As New DataTable("producto") 
                    ' Rellenamos el objeto DataTable' 
                    da.Fill(dt) 
    
                    For Each Dt_Row As DataGridViewRow In DataGridView1.Rows 
                        If Dt_Row.Cells("codprod").Value.ToString = dt.Rows(i)("cod_producto").ToString Then 
                            DataGridView2.DataSource = dt 
                        End If    
                    Next 
                End Using 
            Catch ex As Exception 
                          MessageBox.Show(ex.Message)   'Se ha producido un error' 
            End Try 
        End Sub 





    jueves, 29 de agosto de 2013 4:08

Todas las respuestas

  • Hola.
    En este ejemplo se supone que el DataGridView ya esta cargado.
    Los nombres de los campos y sus valores son ficticios, los tienes que acomodar a tu situacion.
    En un Form con 1 DataGridView y 1 Button, copia y pega el siguiente codigo

    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient

    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Try
                Dim lsQuery As String = String.Empty
                Using loConexion As New SqlConnection(msCadenaSQL)
                    loConexion.Open()   ' abrir conexión
                    'Iniciamos una transaccion, hay que agregar referencia a System.Transactions
                    Using MiTransaccion As New Transactions.TransactionScope
                        For Each loFila As DataGridViewRow In Me.DataGridView1.Rows
                            If lF_bExisteCodigo(loFila.Cells("Codigo").Value.ToString()) = True Then
                                'Modificar registro
                                lsQuery = "Update TU_TABLA Set CAMPO1=@Campo1, CAMPO2=@Campo2 Where CODIGO=@Codigo"
                                ' crear comando
                                Using loComando As New SqlCommand(lsQuery, loConexion)
                                    'añadir parametros al comando
                                    loComando.Parameters.Add(New SqlParameter("@Campo1", Valor1))
                                    loComando.Parameters.Add(New SqlParameter("@Campo2", Valor2))
                                    loComando.Parameters.Add(New SqlParameter("@Codigo", loFila.Cells("Codigo").Value))
                                    loComando.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                        MiTransaccion.Complete()
                    End Using
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Function lF_bExisteCodigo(ByVal vsCodigo As String) As Boolean
            Dim lbRetorno As Boolean = False
            Try
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Dim lsQuery As String = "Select Count(*) From TU_TABLA Where CODIGO=@Codigo"
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametros al comando
                        loComando.Parameters.Add(New SqlParameter("@Codigo", vsCodigo))
                        loConexion.Open()
                        Dim liResultado As Integer = CInt(loComando.ExecuteScalar())
                        If liResultado > 0 Then
                            lbRetorno = True
                        End If
                    End Using
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function
    End Class

    Un saludo dsde Bilbo
    Carlos


    jueves, 29 de agosto de 2013 7:50
  • como ves en la imagen donde dice MiTransaccion yo posiciono el mouse sobre la palabra y me muestra ese mensaje pero aun asi me corre el codigo todo bien pero almomento de acer click en elboton, manda otro mensaje  que te lo muestro mas abajo esto ocure si en el datagridview ay unsolo producto o varios

    https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-ash3/993675_156198851250964_1460757642_n.jpg

    y aqui como ves tuve que poner MiTransaccion.dispone() a como temostre el cambio que tuve que hacer arriba tambien lo tuve q aser aqui abajo

    y este es el mensaje q te abia dicho

    https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-frc3/q71/993009_156199621250887_1776915582_n.jpg

    AHORA TE MUESTRO EL CODIGO SIN ACERLE LOS CAMBIO Q TE MENSIONE ANTERIORMENTE Y VERAS LOS MENSAJE DE ERROR Q ME MUESTRA QUE ME MUESTRA 

    donde dice transactions.transcationscope la ayuda de vbnet no encuntra ninguna sugerencia de correcion

    https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash3/q71/s720x720/944771_156200881250761_221321356_n.jpg

    pero si yo quito transactionscope si muestra ayuda de correcion yeso fue lo que ice arriba en la primeras imagenes y ya te mestro la imagen que te digo  que si sale la ayuda

    https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-prn2/q71/1098464_156201494584033_387013646_n.jpg

    espeor que sirvan de ayuda las imagenes para asi un mejor entedimiento 
    LASTIMA QUE NO PUEDAN AGREGAR LAS IMAGENES AQUI EN ESTE FORO SERIA DE UNA GRAN AYUDA 
    YA QUE  ACI UNO MOSTRARIA LOS ERRORES Y NO TENER QUE ESTAR ESCRIBIENDO TANTO QUE AVECES UNO
    SE ENREDA O NO SE DA A ENTENDRE 
    jueves, 29 de agosto de 2013 16:29
  • ok ise un peqeño cambio en el codigo 

    ANTES ESTABA ASI

    abia declardo una variable 

    dim lpc as double

    lpc=DataGridView1.CurrentRow.Cells(1).Value

     loComando.Parameters.Add(New SqlParameter("@pc",lpc)))

    AHORA ESTA ASI

     loComando.Parameters.Add(New SqlParameter("@pc", CStr(loFila.Cells("pc").Value)))

    HACE LA ACTUALIZACION BIEN TODO LOS DATOS DE LA TABLA DE LA BD PERO AUN ME SIGUE MONSTRONADO EL SIGIENTE MENSAGE AL MOMENTO DE HACER CLICK EN EL BOTON ESTS ES EL MENSAJE 

    "REFERENCIA  A OBJETO NO ESTABLECIDA COMO INSTANCIA DE UN OBJETO "

    ASI TENGO EL CODIGO

        Private Sub cmdsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsave.Click
            Try
                Dim MiTransaccion As SqlTransaction
                Dim lsQuery As String = String.Empty
                Using loConexion As New SqlConnection(conexion)
                    loConexion.Open()   ' abrir conexión
                    'Iniciamos una transaccion, hay que agregar referencia a System.Transactions
                    Using MiTransaccion
                        For Each loFila As DataGridViewRow In Me.DataGridView1.Rows
                            If lF_bExisteCodigo(loFila.Cells("codprod").Value.ToString()) = True Then
                                'Modificar registro
                                lsQuery = "Update producto Set pc=@pc, pv=@pv, entrada=@entrada, existencia=@existencia Where cod_producto=@cod_producto"
                                ' crear comando
                                Using loComando As New SqlCommand(lsQuery, loConexion)
                                    'añadir parametros al comando 
                                    loComando.Parameters.Add(New SqlParameter("@pc", CStr(loFila.Cells("pc").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@pv", CStr(loFila.Cells("pV").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@entrada", CStr(loFila.Cells("entrada").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@existencia", CStr(loFila.Cells("exist").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@cod_producto", loFila.Cells("codprod").Value))
                                    loComando.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                        MiTransaccion.Dispose()
                    End Using
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        '*************************************************************************************************
        Private Function lF_bExisteCodigo(ByVal cod_producto As String) As Boolean
            Dim lbRetorno As Boolean = False
            Dim lsQuery As String
            Try
                Using loConexion As New SqlConnection(conexion)
                    lsQuery = "Select Count(*) From producto Where cod_producto=@cod_producto"
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametros al comando
                        loComando.Parameters.Add(New SqlParameter("@cod_producto", cod_producto))
                        loConexion.Open()
                        Dim liResultado As Integer = CInt(loComando.ExecuteScalar())
                        If liResultado > 0 Then
                            lbRetorno = True
                        End If
                    End Using
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function

    jueves, 29 de agosto de 2013 16:54
  • AL FINAL DEL TRY DEL BOTON TENEMOS ESTOS MENSAJE YO AGREGE EL 1 Y 2  PARA SABER CUAL DE ELLOS ERA QUE ME MOSTRABA Y RESULTA QUE EL NUMERO 2 "Button2_Click" TALVEZ ME ECHAN UNA MANO AQUI Q SOLO ES ESTO QUE NO HE LOGRADO SABER XQ ME ENVIA EL MENSAJE

    "REFERENCIA  A OBJETO NO ESTABLECIDA COMO INSTANCIA DE UN OBJETO "

      Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "Button2_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)

    jueves, 29 de agosto de 2013 17:14
  • LO SOLUCIONES DE ESTA MANERA

     Private Sub cmdsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsave.Click
            Try
                Using loConexion As New SqlConnection(conexion)
                    Dim lsQuery As String = String.Empty
                    loConexion.Open()   ' abrir conexión
                    For Each loFila As DataGridViewRow In Me.DataGridView1.Rows
                        If lF_bExisteCodigo(loFila.Cells("codprod").Value.ToString()) = True Then
                            'Modificar registro
                            lsQuery = "UPDATE producto SET pc=@pc, pv=@pv, entrada=@entrada, existencia=@existencia Where cod_producto=@cod_producto"
                            ' crear comando
                            Dim loComando As New SqlCommand(lsQuery, loConexion)
                            'añadir parametros al comando 
        loComando.Parameters.Clear()
        loComando.Parameters.Add(New SqlParameter("@pc", CStr(loFila.Cells("pc").Value)))
        loComando.Parameters.Add(New SqlParameter("@pv", CStr(loFila.Cells("pV").Value)))
        loComando.Parameters.Add(New SqlParameter("@entrada", CStr(loFila.Cells("entrada").Value)))
        loComando.Parameters.Add(New SqlParameter("@existencia", CStr(loFila.Cells("exist").Value)))
        loComando.Parameters.Add(New SqlParameter("@cod_producto", loFila.Cells("codprod").Value))
        loComando.ExecuteNonQuery()
                        End If
                    Next
                    loConexion.Close() 
                End Using
    	Catch Exp As Exception
                MessageBox.Show(Exp.Message, "Button2_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        '*************************************************************************************************
        Private Function lF_bExisteCodigo(ByVal cod_producto As String) As Boolean
            Dim lbRetorno As Boolean = False
            Dim lsQuery As String
            Try
                Using loConexion As New SqlConnection(conexion)
                    lsQuery = "Select Count(*) From producto Where cod_producto=@cod_producto"
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametros al comando
                        loComando.Parameters.Add(New SqlParameter("@cod_producto", cod_producto))
                        loConexion.Open()
                        Dim liResultado As Integer = CInt(loComando.ExecuteScalar())
                        If liResultado > 0 Then
                            lbRetorno = True
                        End If
                    End Using
               End Using
       Catch Exp As SqlException
     MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
       Catch Exp As Exception
     MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function

    jueves, 29 de agosto de 2013 20:53
  • Hola:
    En tu solucion, no usas transacciones.
    ¿Que pasaria si tienes que modificar 5 registros y en el registro 3 te da error?
    Te habra modificado 2 registros y 3 registros se quedan sin modificar.
    Cuando se hace mas de una operacion de Insert/Update/Delete hay que usar transacciones para que se ejecute todo o nada.
    Para usar transacciones tienes que agregar una referencia a System.Transaction, como no te esta funcionando con transacciones:
    ¿Has añadido esa referencia en el proyecto?

    Un saludo desde Bilbo
    Carlos

    viernes, 30 de agosto de 2013 5:49
  • DE QUE MANERA PUEDO RESOLVER CARLOS COMO VES MAS ARRIBA INDICO EL ERROR Q ME MUESTRA AL USAR TRANSACCIONES ASTA PUSE EL CODIGO LO QUE ESTA EN NEGRITA FUE LO QUE MODIFIQUE DEL PRIMER CODIGO QUE ME DISTE XQ MANDABA ERROR TEDEJO EL LINK DE LA IMAGEN PARA Q LO MIRES Y ES  POR ESO QUE ISE EL CAMBIO ASI COMO LO MIRAS EL CODIGO ABAJO

    https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-ash3/q71/s720x720/944771_156200881250761_221321356_n.jpg

    Private Sub cmdsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsave.Click
            Try
                Dim MiTransaccion As SqlTransaction
                Dim lsQuery As String = String.Empty
                Using loConexion As New SqlConnection(conexion)
                    loConexion.Open()   ' abrir conexión
                    'Iniciamos una transaccion, hay que agregar referencia a System.Transactions
                    Using MiTransaccion
                        For Each loFila As DataGridViewRow In Me.DataGridView1.Rows
                            If lF_bExisteCodigo(loFila.Cells("codprod").Value.ToString()) = True Then
                                'Modificar registro
                                lsQuery = "Update producto Set pc=@pc, pv=@pv, entrada=@entrada, existencia=@existencia Where cod_producto=@cod_producto"
                                ' crear comando
                                Using loComando As New SqlCommand(lsQuery, loConexion)
                                    'añadir parametros al comando 
                                    loComando.Parameters.Add(New SqlParameter("@pc", CStr(loFila.Cells("pc").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@pv", CStr(loFila.Cells("pV").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@entrada", CStr(loFila.Cells("entrada").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@existencia", CStr(loFila.Cells("exist").Value)))
                                    loComando.Parameters.Add(New SqlParameter("@cod_producto", loFila.Cells("codprod").Value))
                                    loComando.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                        MiTransaccion.Dispose()
                    End Using
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        '*************************************************************************************************
        Private Function lF_bExisteCodigo(ByVal cod_producto As String) As Boolean
            Dim lbRetorno As Boolean = False
            Dim lsQuery As String
            Try
                Using loConexion As New SqlConnection(conexion)
                    lsQuery = "Select Count(*) From producto Where cod_producto=@cod_producto"
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametros al comando
                        loComando.Parameters.Add(New SqlParameter("@cod_producto", cod_producto))
                        loConexion.Open()
                        Dim liResultado As Integer = CInt(loComando.ExecuteScalar())
                        If liResultado > 0 Then
                            lbRetorno = True
                        End If
                    End Using
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "lF_bExisteCodigo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lbRetorno
        End Function



    viernes, 30 de agosto de 2013 14:37