Compartir a través de


Cómo: Actualizar datos utilizando un TableAdapter

 

Publicado: abril de 2016

Después de modificar y validar los datos en el conjunto de datos, probablemente desee devolver los datos actualizados a una base de datos. Para enviar los datos modificados a una base de datos, llame al método Update de un TableAdapter. El método Update del adaptador actualizará una tabla de datos única y ejecutará el comando correcto (INSERT, UPDATE o DELETE) basándose en el RowState de cada fila de datos de la tabla. Cuando se guardan datos en tablas relacionadas, Visual Studio proporciona un nuevo componente TableAdapterManager que permite guardar en el orden correcto basándose en las restricciones FOREIGN KEY definidas en la base de datos. Para obtener más información, vea Información general sobre la actualización jerárquica.

Nota

Dado que al intentar actualizar un origen de datos con el contenido de un conjunto de datos se pueden producir errores, debe colocar el código que llama al método Update del adaptador dentro de un bloque try/catch.

Aunque el procedimiento exacto para actualizar un origen de datos varía dependiendo de las necesidades de la empresa, la aplicación debe incluir los siguientes pasos:

  1. Llame al método Update del adaptador dentro de un bloque try/catch.

  2. Si se detecta una excepción, buscar la fila de datos que causó el error. Para obtener más información, vea Cómo: Localizar filas con errores.

  3. Resuelva el problema de la fila de datos (si es posible, mediante programación o presentando la fila incorrecta al usuario para que la modifique) y después vuelva a intentar la actualización (HasErrors, GetErrors).

Guardar los datos en una base de datos

Llame al método Update de un TableAdapter, pasando el nombre de la tabla de datos que contiene los valores que se van a escribir en la base de datos.

Para actualizar una base de datos que tiene un conjunto de datos mediante un TableAdapter

  • Incluya el método Update del adaptador dentro de un bloque try/catch. El ejemplo siguiente muestra cómo intentar una actualización desde dentro de un bloque try/catch con el contenido de la tabla Customers en NorthwindDataSet.

                try
                {
                    this.Validate();
                    this.customersBindingSource.EndEdit();
                    this.customersTableAdapter.Update(this.northwindDataSet.Customers);
                    MessageBox.Show("Update successful");
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show("Update failed");
                }
    
            Try
                Me.Validate()
                Me.CustomersBindingSource.EndEdit()
                Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers)
                MsgBox("Update successful")
    
            Catch ex As Exception
                MsgBox("Update failed")
            End Try
    

Actualización de dos tablas relacionadas de un objeto Dataset con un objeto TableAdapter

Al actualizar tablas relacionadas en un conjunto de datos, es importante hacerlo en el orden correcto para reducir la posibilidad de infringir las restricciones de integridad referencial. El orden de ejecución de los comandos también seguirá los índices de DataRowCollection en el conjunto de datos. Para evitar que se produzcan errores de integridad de datos, se recomienda actualizar la base de datos en el siguiente orden:

  1. Tabla secundaria: eliminar registros.

  2. Tabla principal: insertar, actualizar y eliminar registros.

  3. Tabla secundaria: insertar y actualizar registros.

    Nota

    Si va a actualizar dos o más tablas relacionadas, debe incluir toda la lógica de actualización dentro de una transacción. Una transacción es un proceso que asegura que todos los cambios relacionados con una base de datos son correctos antes de confirmar cualquier cambio. Para obtener más información, vea Transacciones y simultaneidad.

Para actualizar dos tablas relacionadas mediante un objeto TableAdapter

  1. Cree tres tablas de datos temporales para los registros que no son iguales.

  2. Llame al método Update para cada subconjunto de filas desde dentro de un bloque try/catch. Si se producen errores en la actualización, se debería preparar una ramificación de salida para resolverlos.

  3. Confirme los cambios en la base de datos.

  4. Elimine las tablas de datos temporales para liberar los recursos.

    En el ejemplo siguiente, se muestra cómo actualizar un origen de datos con un conjunto de datos que contiene tablas relacionadas.

            void UpdateDB()
            {
                NorthwindDataSet.OrdersDataTable deletedChildRecords = 
                    (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
                NorthwindDataSet.OrdersDataTable newChildRecords = 
                    (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
                NorthwindDataSet.OrdersDataTable modifiedChildRecords = 
                    (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
                try
                {
                    if (deletedChildRecords != null)
                    {
                        ordersTableAdapter.Update(deletedChildRecords);
                    }
    
                    customersTableAdapter.Update(northwindDataSet.Customers);
    
                    if (newChildRecords != null)
                    {
                        ordersTableAdapter.Update(newChildRecords);
                    }
    
                    if (modifiedChildRecords != null)
                    {
                        ordersTableAdapter.Update(modifiedChildRecords);
                    }
    
                    northwindDataSet.AcceptChanges();
                }
    
                catch (Exception ex)
                {
                    MessageBox.Show("An error occurred during the update process");
                    // Add code to handle error here.
                }
    
                finally
                {
                    if (deletedChildRecords != null)
                    {
                        deletedChildRecords.Dispose();
                    }
                    if (newChildRecords != null)
                    {
                        newChildRecords.Dispose();
                    }
                    if (modifiedChildRecords != null)
                    {
                        modifiedChildRecords.Dispose();
                    }
                }
            }
    
        Private Sub UpdateDB()
            Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable =
                CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
            Dim newChildRecords As NorthwindDataSet.OrdersDataTable =
                CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
            Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable =
                CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
            Try
                If deletedChildRecords IsNot Nothing Then
                    OrdersTableAdapter.Update(deletedChildRecords)
                End If
    
                CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
                If newChildRecords IsNot Nothing Then
                    OrdersTableAdapter.Update(newChildRecords)
                End If
    
                If modifiedChildRecords IsNot Nothing Then
                    OrdersTableAdapter.Update(modifiedChildRecords)
                End If
    
                NorthwindDataSet.AcceptChanges()
    
            Catch ex As Exception
                MessageBox.Show("An error occurred during the update process")
                ' Add code to handle error here.
    
            Finally
                If deletedChildRecords IsNot Nothing Then
                    deletedChildRecords.Dispose()
                End If
    
                If newChildRecords IsNot Nothing Then
                    newChildRecords.Dispose()
                End If
    
                If modifiedChildRecords IsNot Nothing Then
                    modifiedChildRecords.Dispose()
                End If
    
            End Try
        End Sub
    

Vea también

Información general sobre TableAdapter
Tutoriales sobre datos
Enlazar controles de Windows Forms a datos en Visual Studio
Conectarse a datos en Visual Studio
Preparar la aplicación para recibir datos
Buscar datos en la aplicación
Enlazar controles a los datos en Visual Studio
Modificar datos en la aplicación
Validar datos
Guardar datos