Mise à jour hiérarchiqueHierarchical update

Mise à jour hiérarchique fait référence au processus d’enregistrement des données mises à jour (à partir d’un jeu de données de deux ou plusieurs tables connexes) dans une base de données tout en conservant les règles d’intégrité référentielle.Hierarchical update refers to the process of saving updated data (from a dataset with two or more related tables) back to a database while maintaining referential integrity rules. L’intégrité référentielle fait référence aux règles de cohérence fournies par les contraintes dans une base de données qui contrôlent le comportement d’insertion, de mise à jour et de suppression des enregistrements connexes.Referential integrity refers to the consistency rules provided by the constraints in a database that control the behavior of inserting, updating, and deleting related records. Par exemple, il est de l’intégrité référentielle impose la création d’un enregistrement de client avant d’autoriser les commandes doit être créé pour ce client.For example, it's referential integrity that enforces the creation of a customer record before allowing orders to be created for that customer. Pour plus d’informations sur les relations dans les jeux de données, consultez des relations dans les jeux de donnéesFor more information about relationships in datasets, see Relationships in datasets

La fonctionnalité de mise à jour hiérarchique utilise un TableAdapterManager pour gérer le TableAdapters dans un dataset typé.The hierarchical update feature uses a TableAdapterManager to manage the TableAdapters in a typed dataset. Le TableAdapterManager composant est un Visual StudioVisual Studio-généré (classe), donc il n’est pas dans le cadre de la .NET Framework.NET Framework.The TableAdapterManager component is a Visual StudioVisual Studio-generated class, so it's not part of the .NET Framework.NET Framework. Lorsque vous faites glisser une table à partir de la fenêtre sources de données à un Windows Form ou d’une page WPF, Visual Studio ajoute une variable de type TableAdapterManager pour le formulaire ou la page, et il apparaît dans le concepteur dans la barre d’état du composant.When you drag a table from the data sources window to a Windows Form or WPF page, Visual Studio adds a variable of type TableAdapterManager to the form or page, and you see it in the designer in the component tray. Pour plus d’informations sur la TableAdapterManager de classe, consultez la section de référence de TableAdapterManager de TableAdapters.For detailed information about the TableAdapterManager class, see the TableAdapterManager Reference section of TableAdapters.

Par défaut, un jeu de données traite les tables associées en tant que « relations uniquement, » ce qui signifie qu’il n’appliquer des contraintes de clé étrangère.By default, a dataset treats related tables as "relations only," which means that it doesn't enforce foreign key constraints. Vous pouvez modifier ce paramètre au moment du design à l’aide du Concepteur de Dataset.You can modify that setting at design time by using the Dataset Designer. Sélectionnez la ligne de relation entre deux tables pour afficher les Relation boîte de dialogue.Select the relation line between two tables to bring up the Relation dialog box. Les modifications apportées ici déterminent comment le composant TableAdapterManager comporte quand il renvoyer les modifications dans les tables associées à la base de données.The changes you make here will determine how the TableAdapterManager behaves when it send the changes in the related tables back to the database.

Activer la mise à jour hiérarchique dans un jeu de donnéesEnable hierarchical update in a dataset

Par défaut, la mise à jour hiérarchique est activée pour tous les nouveaux jeux de données qui est ajoutés ou créés dans un projet.By default, hierarchical update is enabled for all new datasets that are added or created in a project. Activer ou désactiver les mises à jour hiérarchique en définissant le mise à jour hiérarchique propriété d’un dataset typé dans le jeu de données True ou False:Turn hierarchical update on or off by setting the Hierarchical Update property of a typed dataset in The dataset to True or False:

Paramètre de mise à jour hiérarchique

Créez une relation entre les tablesCreate a new relation between tables

Pour créer une nouvelle relation entre deux tables, dans le Concepteur de Dataset, sélectionnez la barre de titre de chaque table, avec le bouton droit et sélectionnez ajouter une relation.To create a new relation between two tables, in the Dataset Designer, select the title bar of each table, then right-click and select Add relation.

Mise à jour hiérarchique Ajouter menu de relation

Comprendre les contraintes de clé étrangère, les mises à jour en cascade et les suppressionsUnderstand foreign-key constraints, cascading updates, and deletes

Il est important de comprendre comment contraintes de clé étrangère et le comportement en cascade dans la base de données sont créés dans le code du dataset générée.It's important to understand how foreign-key constraints and cascading behavior in the database are created in the generated dataset code.

Par défaut, les tables de données dans un jeu de données sont générées avec des relations (DataRelation) qui correspondent aux relations dans la base de données.By default, the data tables in a dataset are generated with relationships (DataRelation) that match the relationships in the database. Toutefois, la relation dans le jeu de données n’est pas générée comme une contrainte foreign key.However, the relationship in the dataset is not generated as a foreign-key constraint. Le DataRelation est configuré en tant que Relation uniquement sans UpdateRule ou DeleteRule en vigueur.The DataRelation is configured as Relation Only without UpdateRule or DeleteRule in effect.

Par défaut, les mises à jour en cascade et les suppressions en cascade sont désactivées même si la relation de base de données est définie avec les mises à jour en cascade et/ou suppressions en cascade sous tension.By default, cascading updates and cascading deletes are turned off even if the database relationship is set with cascading updates and/or cascading deletes turned on. Par exemple, puis que vous essayez d’enregistrer les données et de création d’un nouveau client et une commande peuvent provoquer un conflit avec les contraintes de clé étrangère sont définies dans la base de données.For example, creating a new customer and a new order and then trying to save the data can cause a conflict with the foreign-key constraints that are defined in the database. Pour plus d’informations, consultez désactiver les contraintes pendant le remplissage d’un dataset.For more information, see Turn off constraints while filling a dataset.

Définir l’ordre pour effectuer des mises à jourSet the order to perform updates

Définition de l’ordre pour effectuer des mises à jour définit l’ordre de la personne insère, met à jour et les suppressions qui est requis pour enregistrer toutes les données modifiées dans toutes les tables d’un dataset.Setting the order to perform updates sets the order of the individual inserts, updates, and deletes that are required to save all the modified data in all tables of a dataset. Lors de la mise à jour hiérarchique est activée, les insertions sont exécutées en premier, puis met à jour et supprime.When hierarchical update is enabled, inserts are performed first, then updates, and then deletes. Le TableAdapterManager fournit un UpdateOrder propriété qui peut être ensemble pour effectuer des mises à jour en premier lieu, puis insertions et suppressions.The TableAdapterManager provides an UpdateOrder property that can be set to perform updates first, then inserts, and then deletes.

Note

Il est important de comprendre que l’ordre de mise à jour est entièrement inclusif.It's important to understand that the update order is all inclusive. Autrement dit, lorsque les mises à jour sont effectuées, insertions et suppressions sont exécutées pour toutes les tables dans le jeu de données.That is, when updates are performed, inserts, and then deletes are performed for all tables in the dataset.

Pour définir le UpdateOrder propriété, après avoir fait glisser des éléments à partir de la fenêtre Sources de données sur un formulaire, sélectionnez le TableAdapterManager dans la barre d’état du composant, puis définissez le UpdateOrder propriété dans le propriétés fenêtre.To set the UpdateOrder property, after dragging items from the Data Sources Window onto a form, select the TableAdapterManager in the component tray, and then set the UpdateOrder property in the Properties window.

Créer une copie de sauvegarde d’un jeu de données avant d’effectuer une mise à jour hiérarchiqueCreate a backup copy of a dataset before performing a hierarchical update

Lorsque vous enregistrez des données (en appelant le TableAdapterManager.UpdateAll() méthode), la TableAdapterManager tente de mettre à jour les données pour chaque table dans une transaction unique.When you save data (by calling the TableAdapterManager.UpdateAll() method), the TableAdapterManager attempts to update the data for each table in a single transaction. Si une partie de la mise à jour pour n’importe quelle table échoue, la transaction entière est restaurée.If any part of the update for any table fails, the whole transaction is rolled back. Dans la plupart des cas, la restauration retourne votre application à son état d’origine.In most situations, the rollback returns your application to its original state.

Toutefois, vous pouvez parfois restaurer le jeu de données à partir de la copie de sauvegarde.However, sometimes you might want to restore the dataset from the backup copy. Un exemple de cela peut se produire lorsque vous utilisez des valeurs d’auto-incrémentation.One example of this might occur when you're using auto-increment values. Par exemple, si un enregistrement opération n’a pas réussi, les valeurs d’auto-incrémentation ne sont pas réinitialisées dans le jeu de données et le jeu de données continue à créer des valeurs d’auto-incrémentation. Cela laisse un écart de numérotation qui peuvent ne pas être acceptable dans votre application.For example, if a save operation is not successful, auto-increment values are not reset in the dataset, and the dataset continues to create auto-incrementing values.This leaves a gap in numbering that might not be acceptable in your application. Dans les situations où il s’agit d’un problème, le TableAdapterManager fournit un BackupDataSetBeforeUpdate propriété qui remplace le jeu de données existant par une copie de sauvegarde si la transaction échoue.In situations where this is an issue, the TableAdapterManager provides a BackupDataSetBeforeUpdate property that replaces the existing dataset with a backup copy if the transaction fails.

Note

La copie de sauvegarde est uniquement en mémoire lors de la TableAdapterManager.UpdateAll (méthode) est en cours d’exécution.The backup copy is only in memory while the TableAdapterManager.UpdateAll method is running. Il n’est donc aucun accès par programmation à ce jeu de données de sauvegarde, car il remplace le jeu de données d’origine ou est hors de portée dès que le TableAdapterManager.UpdateAll méthode termine en cours d’exécution.Therefore, there is no programmatic access to this backup dataset because it either replaces the original dataset or goes out of scope as soon as the TableAdapterManager.UpdateAll method finishes running.

Modifier le texte généré le code pour effectuer la mise à jour hiérarchique d’enregistrementModify the generated save code to perform the hierarchical update

Enregistrez les modifications des tables de données associées du dataset dans la base de données en appelant la méthode TableAdapterManager.UpdateAll et en passant le nom du dataset contenant les tables associées.Save changes from the related data tables in the dataset to the database by calling the TableAdapterManager.UpdateAll method and passing in the name of the dataset that contains the related tables. Par exemple, exécutez la méthode TableAdapterManager.UpdateAll(NorthwindDataset) pour envoyer les mises à jour de toutes les tables de NorthwindDataset à la base de données principale.For example, run the TableAdapterManager.UpdateAll(NorthwindDataset) method to send updates from all the tables in NorthwindDataset to the back-end database.

Une fois que vous déplacez des éléments depuis la des Sources de données fenêtre, le code est ajouté automatiquement à la Form_Load événement pour remplir chaque table (le TableAdapter.Fill méthodes).After you drop the items from the Data Sources window, code is automatically added to the Form_Load event to populate each table (the TableAdapter.Fill methods). Code est également ajouté à la enregistrer l’événement de clic de bouton le BindingNavigator pour enregistrer les données du jeu de données dans la base de données (la TableAdapterManager.UpdateAll méthode).Code is also added to the Save button click event of the BindingNavigator to save data from the dataset back to the database (the TableAdapterManager.UpdateAll method).

Le code d'enregistrement généré contient également une ligne de code qui appelle la méthode CustomersBindingSource.EndEdit.The generated save code also contains a line of code that calls the CustomersBindingSource.EndEdit method. Plus spécifiquement, il appelle la EndEdit méthode du premier BindingSourcequi est ajouté au formulaire.More specifically, it calls the EndEdit method of the first BindingSourcethat's added to the form. En d’autres termes, ce code est généré uniquement pour la première table qui est déplacée depuis la des Sources de données fenêtre sur le formulaire.In other words, this code is only generated for the first table that's dragged from the Data Sources window onto the form. L'appel de EndEdit valide toutes les modifications en cours de tous les contrôles liés aux données modifiés.The EndEdit call commits any changes that are in process in any data-bound controls that are currently being edited. Par conséquent, si un contrôle lié aux données a encore le focus et que vous cliquez sur le enregistrer bouton, toutes les modifications en attente dans ce contrôle sont validées avant l’enregistrement réel (la TableAdapterManager.UpdateAll méthode).Therefore, if a data-bound control still has focus and you click the Save button, all pending edits in that control are committed before the actual save (the TableAdapterManager.UpdateAll method).

Note

Le Concepteur de Dataset ajoute uniquement le BindingSource.EndEdit code pour la première table qui est déposée sur le formulaire.The Dataset Designer only adds the BindingSource.EndEdit code for the first table that's dropped onto the form. Par conséquent, vous devez ajouter une ligne de code pour appeler la méthode BindingSource.EndEdit pour chaque table associée dans le formulaire.Therefore, you have to add a line of code to call the BindingSource.EndEdit method for each related table on the form. Dans cette procédure pas à pas, cela signifie que vous devez ajouter un appel à la méthode OrdersBindingSource.EndEdit.For this walkthrough, this means you have to add a call to the OrdersBindingSource.EndEdit method.

  1. Double-cliquez sur le enregistrer bouton sur le BindingNavigator pour ouvrir Form1 dans l’éditeur de Code.Double-click the Save button on the BindingNavigator to open Form1 in the Code Editor.

  2. Ajoutez une ligne de code pour appeler la méthode OrdersBindingSource.EndEdit après la ligne appelant la méthode CustomersBindingSource.EndEdit.Add a line of code to call the OrdersBindingSource.EndEdit method after the line that calls the CustomersBindingSource.EndEdit method. Le code dans le enregistrer cliquez sur le bouton événements doivent ressembler à ce qui suit :The code in the Save button click event should resemble the following:

    Me.Validate()
    Me.CustomersBindingSource.EndEdit()
    Me.OrdersBindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)
    
    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Outre la validation des modifications d’une table enfant associée avant l’enregistrement des données dans une base de données, vous devez aussi peut-être valider les enregistrements parents récemment créés avant d’ajouter de nouveaux enregistrement enfants à un dataset.In addition to committing changes on a related child table before saving data to a database, you might also have to commit newly created parent records before adding new child records to a dataset. En d'autres termes, vous devez peut-être ajouter le nouvel enregistrement parent (Customer) au dataset avant que les contraintes de clé étrangère ne permettent d'ajouter de nouveaux enregistrements enfants (Orders) au dataset.In other words, you might have to add the new parent record (Customer) to the dataset before foreign key constraints enable new child records (Orders) to be added to the dataset. Pour ce faire, vous pouvez utiliser l'événement BindingSource.AddingNew enfant.To accomplish this, you can use the child BindingSource.AddingNew event.

Note

Si vous devez valider les nouveaux enregistrements parents varie selon le type de contrôle qui est utilisée pour lier à votre source de données.Whether you have to commit new parent records depends on the type of control that's used to bind to your data source. Dans cette procédure pas à pas, vous utilisez des contrôles individuels à lier à la table parente.In this walkthrough, you use individual controls to bind to the parent table. Cela requiert le code supplémentaire pour valider le nouvel enregistrement parent.This requires the additional code to commit the new parent record. Si les enregistrements parents ont été affichés à la place dans un contrôle de liaison complexe tel que le DataGridViewce supplémentaires EndEdit appeler pour l’enregistrement parent n’est pas nécessaire.If the parent records were instead displayed in a complex binding control like the DataGridView, this additional EndEdit call for the parent record would not be necessary. En effet, la fonctionnalité sous-jacente de liaison aux données du contrôle gère la validation des nouveaux enregistrements.This is because the underlying data-binding functionality of the control handles the committing of the new records.

Pour ajouter du code afin de valider les enregistrements parents dans le dataset avant d'ajouter de nouveaux enregistrements enfantsTo add code to commit parent records in the dataset before adding new child records

  1. Créez un gestionnaire d'événements pour l'événement OrdersBindingSource.AddingNew.Create an event handler for the OrdersBindingSource.AddingNew event.

    • Ouvrez Form1 en mode conception, sélectionnez OrdersBindingSource dans la barre d’état du composant, sélectionnez événements dans les propriétés fenêtre, et puis double-cliquez sur le AddingNew événement.Open Form1 in design view, select OrdersBindingSource in the component tray, select Events in the Properties window, and then double-click the AddingNew event.
  2. Ajouter une ligne de code au gestionnaire d’événements qui appelle la CustomersBindingSource.EndEdit (méthode).Add a line of code to the event handler that calls the CustomersBindingSource.EndEdit method. Le code du gestionnaire d'événements OrdersBindingSource_AddingNew doit ressembler à ce qui suit :The code in the OrdersBindingSource_AddingNew event handler should resemble the following:

    Me.CustomersBindingSource.EndEdit()
    
    this.customersBindingSource.EndEdit();
    

Référence de TableAdapterManagerTableAdapterManager reference

Par défaut, un TableAdapterManager classe est générée lorsque vous créez un dataset qui contient des tables associées.By default, a TableAdapterManager class is generated when you create a dataset that contains related tables. Pour empêcher la classe en cours de génération, modifiez la valeur de la Hierarchical Update propriété du jeu de données à la valeur false.To prevent the class from being generated, change the value of the Hierarchical Update property of the dataset to false. Lorsque vous faites glisser une table qui a une relation sur l’aire de conception d’un Windows Form ou d’une page WPF, Visual Studio déclare une variable membre de la classe.When you drag a table that has a relation onto the design surface of a Windows Form or WPF page, Visual Studio declares a member variable of the class. Si vous n’utilisez pas la liaison de données, vous devez la déclarer manuellement.If you don't use databinding, you have to manually declare the variable.

Le TableAdapterManager classe n’est pas dans le cadre de la .NET Framework.NET Framework.The TableAdapterManager class is not part of the .NET Framework.NET Framework. Par conséquent, vous ne pouvez pas chercher dans la documentation.Therefore, you cannot look it up in the documentation. Il est créé au moment du design dans le cadre du processus de création de jeu de données.It is created at design time as part of the dataset creation process.

Voici les méthodes fréquemment utilisées et les propriétés de la TableAdapterManager classe :The following are the frequently used methods and properties of the TableAdapterManager class:

MembreMember DescriptionDescription
Méthode UpdateAllUpdateAll method Enregistre toutes les données de toutes les tables de données.Saves all data from all data tables.
Propriété BackUpDataSetBeforeUpdateBackUpDataSetBeforeUpdate property Détermine s’il faut créer une copie de sauvegarde du jeu de données avant d’exécuter le TableAdapterManager.UpdateAll (méthode). Valeur booléenne.Determines whether to create a backup copy of the dataset before executing the TableAdapterManager.UpdateAll method.Boolean.
tableName TableAdapter propriététableName TableAdapter property Représente un TableAdapter.Represents a TableAdapter. Le texte généré TableAdapterManager contient une propriété pour chaque TableAdapter qu’il gère.The generated TableAdapterManager contains a property for each TableAdapter it manages. Par exemple, un jeu de données avec une table Customers et Orders est générée avec un TableAdapterManager contenant CustomersTableAdapter et OrdersTableAdapter propriétés.For example, a dataset with a Customers and Orders table is generated with a TableAdapterManager that contains CustomersTableAdapter and OrdersTableAdapter properties.
Propriété UpdateOrderUpdateOrder property Contrôle l’ordre de l’individuelles insert, update et les commandes delete.Controls the order of the individual insert, update, and delete commands. Définissez cette propriété à une des valeurs dans le TableAdapterManager.UpdateOrderOption énumération.Set this to one of the values in the TableAdapterManager.UpdateOrderOption enumeration.

Par défaut, le UpdateOrder a la valeur InsertUpdateDelete.By default, the UpdateOrder is set to InsertUpdateDelete. Cela signifie que les insertions, puis met à jour et supprime toutes les tables dans le jeu de données est effectuée.This means that inserts, then updates, and then deletes are performed for all tables in the dataset.

Voir aussiSee also