Cómo: Guardar cambios de un conjunto de datos en una base de datos
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 o de un adaptador de datos. El método Update del adaptador actualiza una sola tabla de datos y ejecuta 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 intentar actualizar un origen de datos con el contenido de un conjunto de datos puede 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:
Ejecute código que intenta enviar actualizaciones a la base de datos dentro de un bloque try/catch.
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.
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 (propiedad HasErrors, método GetErrors).
Guardar los datos en una base de datos
Llame al método Update de un objeto TableAdapter o adaptador de datos, pasando el nombre de la tabla de datos que contiene los valores que se van a escribir en la base de datos. Para obtener más información sobre cómo guardar los datos de una única tabla de datos en una base de datos, vea Tutorial: Guardar datos en una base de datos (Tabla única).
Para actualizar una base de datos con un conjunto de datos utilizando un objeto TableAdapter
Incluya el método TableAdapter.Update dentro de un bloque try/catch. El ejemplo siguiente muestra cómo intentar una actualización con el contenido de la tabla Customers del conjunto de datos NorthwindDataSet.
Try Me.Validate() Me.CustomersBindingSource.EndEdit() Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers) MsgBox("Update successful") Catch ex As Exception MsgBox("Update failed") End Try
try { this.Validate(); this.customersBindingSource.EndEdit(); this.customersTableAdapter.Update(this.northwindDataSet.Customers); MessageBox.Show("Update successful"); } catch (System.Exception ex) { MessageBox.Show("Update failed"); }
Para actualizar una base de datos con un conjunto de datos utilizando un adaptador de datos
Incluya el método DataAdapter.Update dentro de un bloque try/catch. El ejemplo siguiente muestra cómo intentar una actualización en un origen de datos con el contenido de Table1 en DataSet1.
Try SqlDataAdapter1.Update(Dataset1.Tables("Table1")) Catch x As Exception ' Error during Update, add code to locate error, reconcile ' and try to update again. End Try
try { SqlDataAdapter1.Update(Dataset1.Tables["Table1"]); } catch (Exception e) { // Error during Update, add code to locate error, reconcile // and try to update again. }
Actualizar dos tablas relacionadas de un conjunto de datos
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:
Tabla secundaria: eliminar registros.
Tabla principal: insertar, actualizar y eliminar registros.
Tabla secundaria: insertar y actualizar registros.
Para obtener información detallada sobre cómo guardar los datos de varias tablas, vea Tutorial: Guardar datos en una base de datos (Varias tablas).
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
Cree tres DataTables temporales para contener los registros que no son iguales.
Llame al método Update para cada subconjunto de filas desde dentro de un bloque try/catch. Si se producen errores de actualización, la acción sugerida es separarlos y resolverlos.
Confirmar los cambios desde el conjunto de datos en la base de datos.
Elimine las tablas de datos temporales para liberar los recursos.
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
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(); } } }
Para actualizar dos tablas relacionadas mediante un adaptador de datos
Llame al método Update de cada adaptador de datos.
En el ejemplo siguiente, se muestra cómo actualizar un origen de datos con un conjunto de datos que contiene tablas relacionadas. Para seguir el orden anterior, se crean tres tablas DataTables temporales donde se incluirán los registros que no son iguales. Después, se llama al método Update para cada subconjunto de filas desde dentro de un bloque try/catch. Si se producen errores de actualización, la acción sugerida es separarlos y resolverlos. Después, el conjunto de datos confirma los cambios. Por último, las tablas de datos provisionales se eliminan para liberar los recursos.
Private Sub UpdateDB() Dim DeletedChildRecords As DataTable = dsNorthwind1.Orders.GetChanges(DataRowState.Deleted) Dim NewChildRecords As DataTable = dsNorthwind1.Orders.GetChanges(DataRowState.Added) Dim ModifiedChildRecords As DataTable = dsNorthwind1.Orders.GetChanges(DataRowState.Modified) Try If Not DeletedChildRecords Is Nothing Then daOrders.Update(DeletedChildRecords) End If daCustomers.Update(dsNorthwind1, "Customers") If Not NewChildRecords Is Nothing Then daOrders.Update(NewChildRecords) End If If Not ModifiedChildRecords Is Nothing Then daOrders.Update(ModifiedChildRecords) End If dsNorthwind1.AcceptChanges() Catch ex As Exception ' Update error, resolve and try again Finally If Not DeletedChildRecords Is Nothing Then DeletedChildRecords.Dispose() End If If Not NewChildRecords Is Nothing Then NewChildRecords.Dispose() End If If Not ModifiedChildRecords Is Nothing Then ModifiedChildRecords.Dispose() End If End Try End Sub
void UpdateDB() { System.Data.DataTable DeletedChildRecords = dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Deleted); System.Data.DataTable NewChildRecords = dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Added); System.Data.DataTable ModifiedChildRecords = dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Modified); try { if (DeletedChildRecords != null) { daOrders.Update(DeletedChildRecords); } if (NewChildRecords != null) { daOrders.Update(NewChildRecords); } if (ModifiedChildRecords != null) { daOrders.Update(ModifiedChildRecords); } dsNorthwind1.AcceptChanges(); } catch (Exception ex) { // Update error, resolve and try again } finally { if (DeletedChildRecords != null) { DeletedChildRecords.Dispose(); } if (NewChildRecords != null) { NewChildRecords.Dispose(); } if (ModifiedChildRecords != null) { ModifiedChildRecords.Dispose(); } } }
Vea también
Conceptos
Enlazar controles de Windows Forms a datos en Visual Studio
Preparar la aplicación para recibir datos
Enlazar controles a los datos en Visual Studio
Modificar datos en la aplicación