Comment : enregistrer les modifications apportées à un groupe de données dans une base de données
Lorsque les données contenues dans votre groupe de données ont été modifiées et validées, vous souhaiterez probablement renvoyer les données mises à jour vers une base de données. Pour envoyer les données modifiées à une base de données, vous appelez la méthode Update d'un TableAdapter ou d'un adaptateur de données. La méthode Update de l'adaptateur met à jour une table de données unique et exécute la commande correcte (INSERT, UPDATE ou DELETE) en fonction du RowState de chaque ligne de données contenue dans la table.
Lorsque vous enregistrez des données dans des tables connexes, Visual Studio fournit un composant TableAdapterManager qui aide à effectuer des enregistrements dans l'ordre approprié selon les contraintes de clé étrangère définies dans la base de données. Pour plus d'informations, consultez Vue d'ensemble de la mise à jour hiérarchique.
Notes
Comme la tentative de mise à jour d'une source de données avec le contenu d'un groupe de données peut entraîner des erreurs, il est conseillé de placer le code qui appelle la méthode Update de l'adaptateur dans un bloc try/catch.
La procédure exacte de mise à jour d'une source de données varie en fonction des besoins de votre entreprise, mais votre application doit comprendre les étapes suivantes :
Exécutez le code qui tente d'envoyer les mises à jour à la base de données dans un bloc try/ bloccatch.
Si une exception est interceptée, rechercher la ligne de données ayant provoqué l'erreur. Pour plus d'informations, consultez Comment : trouver des lignes contenant des erreurs.
Résolvez le problème dans la ligne de données (par programmation si possible ou en affichant la ligne non valide pour que l'utilisateur la modifie), puis retentez la mise à jour (propriété HasErrors, méthode GetErrors).
Enregistrement des données dans une base de données
Appelez la méthode Update d'un TableAdapter ou d'un adaptateur de données en passant le nom de la table de données contenant les valeurs à écrire dans la base de données. Pour plus d'informations sur l'enregistrement des données d'une table de données unique dans une base de données, consultez Procédure pas à pas : enregistrement de données dans une base de données (table unique).
Pour mettre à jour une base de données avec un groupe de données à l'aide d'un TableAdapter
Insérez la méthode TableAdapter.Update dans un bloc try/catch. L'exemple suivant montre comment effectuer une tentative de mise à jour avec le contenu de la table Customers du 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"); }
Pour mettre à jour une base de données avec un groupe de données à l'aide d'un adaptateur de données
Insérez la méthode DataAdapter.Update dans un bloc try/catch. L'exemple suivant montre comment effectuer une tentative de mise à jour d'une source de données avec le contenu de Table1 dans 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. }
Mise à jour de deux tables connexe dans un groupe de données
Lors de la mise à jour de tables connexes dans un groupe de données, il est important de respecter la séquence correcte afin de minimiser les risques de violation des contraintes d'intégrité référentielle. L'ordre d'exécution des commandes respectera également les indices du DataRowCollection contenu dans le groupe de données. Pour éviter le déclenchement d'erreurs d'intégrité des données, il est recommandé de mettre à jour la base de données en respectant la séquence suivante :
Table enfant : suppression des enregistrements.
Table parente : insertion, mise à jour et suppression des enregistrements.
Table enfant : insertion et mise à jour des enregistrements.
Pour plus d'informations sur l'enregistrement de données de plusieurs tables, consultez Procédure pas à pas : enregistrement de données dans une base de données (plusieurs tables).
Si vous mettez à jour plusieurs tables connexes, vous devez inclure toute la logique de mise à jour dans une transaction. Une transaction est un processus qui garantit que toutes les modifications connexes apportées à une base de données sont réussies avant de valider toute modification. Pour plus d'informations, consultez Transactions et concurrence.
Pour mettre à jour deux tables connexes à l'aide d'un TableAdapter
Créez trois DataTables temporaires qui contiendront les enregistrements qui diffèrent.
Appelez la méthode Update pour chaque sous-ensemble de lignes à partir d'un bloc try/catch. En cas d'erreurs de mise à jour, l'action recommandée est de se débrancher et de résoudre les erreurs.
Validez les modifications du groupe de données dans la base de données.
Éliminez les tables de données temporaires pour libérer les ressources.
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(); } } }
Pour mettre à jour deux tables connexes à l'aide d'un adaptateur de données
Appelez la méthode Update de chaque adaptateur de données.
L'exemple suivant montre comment mettre à jour une source de données à l'aide d'un groupe de données contenant des tables connexes. Pour respecter l'ordre ci-dessus, trois DataTables temporaires seront créés pour contenir les enregistrements qui diffèrent. La méthode Update sera ensuite appelée pour chaque sous-ensemble de lignes à partir d'un bloc try/catch. En cas d'erreurs de mise à jour, l'action recommandée est de se débrancher et de résoudre les erreurs. Le groupe de données valide ensuite les modifications. Pour terminer, éliminez les tables de données temporaires pour libérer les ressources.
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(); } } }
Voir aussi
Concepts
Liaison de contrôles Windows Forms à des données dans Visual Studio
Préparation de votre application pour recevoir des données
Extraction de données dans votre application
Liaison de contrôles à des données dans Visual Studio
Modification des données dans votre application