none
Actualizar una tabla en SQLServer con DataGridView

    Pregunta

  • Hola todos.

    Consulta, tengo una tabla en sql server la cual obtengo lo datos a través de un procedimiento almacenado y se lo asigno a un SqlDataAdapter y el cual a su vez lleno un DataTable el que asigno al DataGridView. Hasta ahi no hay problema.

    Lo que deseo en que la modificar un o los  datos en DataGridView y pinchar un botón grabar, se me actualice los datos de tabla en SQL Server. Se que se puede hacer con el método Update del SqlDataAdapter, pero no se como utilizarlo.

    Si alguien me puede explicar los parámetros que necesita el metodo update del SqlDataAdapter

    viernes, 24 de junio de 2016 17:28

Respuestas

  • "Nortino" preguntó:

    > Lo que deseo en que la modificar un o los  datos en DataGridView y pinchar un botón grabar,
    > se me actualice los datos de tabla en SQL Server. Se que se puede hacer con el método Update
    > del SqlDataAdapter, pero no se como utilizarlo.
    >
    > Si alguien me puede explicar los parámetros que necesita el metodo update del SqlDataAdapter

    Hola:

    Me imagino que estarás utilizando Visual Basic como tu lenguaje de programación .NET favorito, ya que la pregunta la has efectuado en el foro de Visual Basic. ;-)

    Ignoro cómo recuperas los datos que enlazas con el control DataGridView, pero te diré que para nada te hace falta declarar variables a nivel del proyecto, módulo, clase o formulario, siempre y cuando el control DataGridView se encuentre enlazado a un objeto DataTable, porque tampoco es necesario utilizar un objeto DataSet si solamente vas a trabajar con una única tabla.

    Inserta en tu proyecto el siguiente módulo que te servirá de ayuda para el acceso a datos:

    Imports System.Data.SqlClient
    
    Friend Module HelperDataAccess
    
        Private Function GetConnectionString() As String
    
            ' La función devolverá la cadena de conexión utilizada
            ' por el proyeto, y en ella puedes escribir el código
            ' fuente necesario para leerla desde el archivo de
            ' configuración de la aplicación.
            '
            Return "Data Source=(local);Initial Catalog=NombreBaseDatos;Integrated Security=SSPI"
    
        End Function
    
        ''' <summary>
        ''' Ejecuta la consulta SQL de selección existente en el objeto Command
        ''' devolviendo un objeto DataTable.
        ''' </summary>
        ''' <param name="cmd">objeto Command debidamente configurado.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Function GetData(cmd As SqlCommand) As DataTable
    
            If (cmd Is Nothing) Then
                Throw New ArgumentNullException("cmd")
            End If
    
            Dim dt As New DataTable()
    
            ' Configuramos una conexión con el origen de datos.
            '
            Using cnn As New SqlConnection(GetConnectionString())
    
                cmd.Connection = cnn
    
                Dim da As New SqlDataAdapter(cmd)
    
                ' Añadimos información sobre la clave principal de la tabla. 
                '
                da.MissingSchemaAction = MissingSchemaAction.AddWithKey
    
                da.Fill(dt)
    
                ' En el objeto DataTable guardamos el objeto
                ' Command utilizado para ejecutar la consulta.
                '
                dt.ExtendedProperties.Add("Command", cmd)
    
            End Using
    
            Return dt
    
        End Function
    
        ''' <summary>
        ''' Actualiza el origen de datos con los datos existentes
        ''' en el objeto DataTable pasado al procedimiento.
        ''' </summary>
        ''' <param name="dt">Objeto DataTable configurado con el objeto Command y la
        ''' cadena de conexión utilizadas para rellenar el objeto DataTable.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Friend Function UpdateData(dt As DataTable) As Integer
    
            If (dt Is Nothing) Then
                Throw New ArgumentNullException("dt")
            End If
    
            ' Recuperamos el objeto Command almacenado
            ' en las propiedades extendidas del objeto
            ' DataTable.
            '
            Dim cmd As SqlCommand = DirectCast(dt.ExtendedProperties("Command"), SqlCommand)
            If (cmd Is Nothing) Then
                Throw New ArgumentException("No se ha configurado el objeto Command.")
            End If
    
            ' Referenciar el objeto Connection
            Using cnn As SqlConnection = cmd.Connection
    
                ' Obtener la cadena de conexión
                cnn.ConnectionString = GetConnectionString()
    
                ' Configurar el adaptador de datos.
                Dim da As New SqlDataAdapter(cmd)
    
                ' Generar automáticamente las propiedades del adaptador de datos, pero
                ' para ello, la tabla tiene que tener establecida su correspondiente
                ' clave principal.
                '
                Dim cb As New SqlCommandBuilder(da)
      cb.QuotePrefix = "["
                cb.QuoteSuffix = "]"
    With da .InsertCommand = cb.GetInsertCommand() .DeleteCommand = cb.GetDeleteCommand() .UpdateCommand = cb.GetUpdateCommand() End With Return da.Update(dt) End Using End Function End Module

    Modifica la función GetConnectionString para que la misma devuelva la cadena de conexión que estás utilizando en tu proyecto.

    Cuando desees recuperar un objeto DataTable como resultado de ejecutar una consulta SQL de selección, llamarías al método GetData existente en el módulo:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                Dim cmd As New SqlCommand()
    
                ' Seleccionamos todos los clientes de la tabla Clientes donde
                ' el valor del campo IdCliente sea inferior a 4300020.
                '
                cmd.CommandText = "SELECT * FROM Clientes WHERE IdCliente < @id"
                cmd.Parameters.AddWithValue("@id", 4300020)
    
                DataGridView1.DataSource = GetData(cmd)
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Y ahora, cuando desees actualizar tu base de datos de SQL Server, tan solo tienes que llamar al método UpdateData del módulo pasándole el objeto DataTable enlazado con el control DataGridView:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            Try
                ' Recuperamos un objeto DataTable con los cambios que
                ' se han realizado en el objeto DataTable enlazado
                ' con el control DataGridView.
                '
                Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable).GetChanges()
    
                Dim n As Integer
    
                If (Not dt Is Nothing) Then
                    ' Si existe algún cambio actualizamos el origen de datos.
                    n = UpdateData(dt)
                End If
    
                MessageBox.Show($"Nº de registros actualizados: {n}")
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Observa que solamente llamaremos al método UpdateData si se han producido cambios en el objeto DataTable enlazado con el control DataGridView, ya que utilizamos el método GetChanges para obtener un objeto DataTable solamente con las modificaciones efectuadas.

    Como indico en los comentarios que aparecen en la función UpdateData, ésta hará bien su trabajo siempre y cuando la tabla cuyos datos has seleccionado y deseas actualizar, tenga establecida una CLAVE PRINCIPAL, porque de no ser así, el objeto SqlCommandBuilder no sabrá configurar las propiedad InsertCommand, UpdateCommand y DeleteCommand del adaptador de datos. Espero que tu tabla tenga establecida una clave principal. ;-)

    ¡Eso es todo!

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    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, se inteligente y activa la instrucción
    Option Strict.



    sábado, 25 de junio de 2016 9:05
    Moderador