Enregistrer les données dans la base de donnéesSave data back to the database

Le jeu de données est une copie en mémoire des données.The dataset is an in-memory copy of data. Si vous modifiez ces données, il est conseillé d’enregistrer ces modifications dans la base de données.If you modify that data, it's a good practice to save those changes back to the database. Pour cela de trois manières :You do this in one of three ways:

  • En appelant une de le Update méthodes d’un TableAdapterBy calling one of the Update methods of a TableAdapter

  • En appelant une des DBDirect méthodes du TableAdapterBy calling one of DBDirect methods of the TableAdapter

  • En appelant le UpdateAll méthode sur le composant TableAdapterManager généré par Visual Studio pour vous lorsque le jeu de données contient des tables qui sont liées à d’autres tables dans le jeu de donnéesBy calling the UpdateAll method on the TableAdapterManager that Visual Studio generates for you when the dataset contains tables that are related to other tables in the dataset

Lors de la lier des données des tables de jeu de données aux contrôles sur une page Windows Form ou XAML, l’architecture de liaison de données fait tout le travail pour vous.When you data bind dataset tables to controls on a Windows Form or XAML page, the data binding architecture does all the work for you.

Si vous êtes familiarisé avec les TableAdapters, vous pouvez passer directement à une des rubriques suivantes :If you're familiar with TableAdapters, you can jump directly to one of these topics:

RubriqueTopic DescriptionDescription
Guide pratique pour insérer de nouveaux enregistrements dans une base de donnéesInsert new records into a database Comment effectuer des mises à jour et insertions à l’aide des objets de commande ou des TableAdaptersHow to perform updates and inserts using TableAdapters or Command objects
Guide pratique pour mettre à jour les données à l’aide d’un TableAdapterUpdate data by using a TableAdapter Comment effectuer des mises à jour avec les TableAdaptersHow to perform updates with TableAdapters
Mise à jour hiérarchiqueHierarchical update Comment effectuer des mises à jour à partir d’un jeu de données avec deux ou plusieurs tables connexesHow to perform updates from a dataset with two or more related tables
Gérer une exception d’accès concurrentielHandle a concurrency exception Comment gérer des exceptions lorsque deux utilisateurs tentent de modifier les mêmes données dans une base de données en même tempsHow to handle exceptions when two users attempt to change the same data in a database at the same time
Comment : enregistrer des données à l’aide d’une transactionHow to: Save data by using a transaction Comment enregistrer des données dans une transaction en utilisant le système.How to save data in a transaction using the System. Espace de noms de transactions et un objet TransactionScopeTransactions namespace and a TransactionScope object
Enregistrer des données dans une transactionSave data in a transaction Procédure pas à pas qui crée une application Windows Forms pour montrer l’enregistrement des données à une base de données à l’intérieur d’une transactionWalkthrough that creates a Windows Forms application to demonstrate saving data to a database inside a transaction
Enregistrer des données dans une base de données (plusieurs tables)Save data to a database (multiple tables) Comment modifier les enregistrements et enregistrer les modifications dans plusieurs tables dans la base de donnéesHow to edit records and save changes in multiple tables back to the database
Guide pratique pour enregistrer les données d’un objet dans une base de donnéesSave data from an object to a database Comment passer des données à partir d’un objet qui n’est pas dans un jeu de données à une base de données à l’aide d’une méthode DbDirect du TableAdapterHow to pass data from an object that is not in a dataset to a database by using a TableAdapter DbDirect method
Enregistrer des données avec les méthodes DBDirect du TableAdapterSave data with the TableAdapter DBDirect methods Comment utiliser le TableAdapter pour envoyer des requêtes SQL directement à la base de donnéesHow to use the TableAdapter to send SQL queries directly to the database
Enregistrer un dataset au format XMLSave a dataset as XML Comment enregistrer un jeu de données dans un document XMLHow to save a dataset to an XML document

Mises à jour de deux étapesTwo-stage updates

La mise à jour une source de données est un processus en deux étapes.Updating a data source is a two-step process. La première étape consiste à mettre à jour le jeu de données avec les nouveaux enregistrements, enregistrements modifiés ou enregistrements supprimés.The first step is to update the dataset with new records, changed records, or deleted records. Si votre application envoie jamais ces modifications à la source de données, puis vous avez terminé la mise à jour.If your application never sends those changes back to the data source, then you're finished with the update.

Si vous envoyez les modifications apportées à la base de données, une deuxième étape est requise.If you do send the changes back to the database, a second step is required. Si vous n’utilisez pas des contrôles liés aux données, vous devez appeler manuellement la Update méthode du TableAdapter même (ou adaptateur de données) que vous avez utilisé pour remplir le jeu de données.If you aren't using data-bound controls, you have to manually call the Update method of the same TableAdapter (or data adapter) that you used to populate the dataset. Toutefois, vous pouvez également utiliser différents adaptateurs, par exemple, pour déplacer des données à partir d’une source de données vers un autre ou pour mettre à jour de plusieurs sources de données.However, you can also use different adapters, for example, to move data from one data source to another or to update multiple data sources. Si vous n’utilisez pas la liaison de données et enregistrez les modifications pour les tables associées, vous devez instancier manuellement une variable de la génération d’automatique TableAdapterManager classe, puis appelez ses UpdateAll (méthode).If you aren't using data binding, and are saving changes for related tables, you have to manually instantiate a variable of the auto-generated TableAdapterManager class, and then call its UpdateAll method.

Diagramme conceptuel des mises à jour du jeu de données

Un jeu de données contient des collections de tables qui contiennent une collection de lignes.A dataset contains collections of tables, which contain a collections of rows. Si vous envisagez de mettre à jour une source de données sous-jacente ultérieurement, vous devez utiliser les méthodes sur le DataTable.DataRowCollection propriété lors de l’ajout ou la suppression de lignes.If you intend to update an underlying data source later, you must use the methods on the DataTable.DataRowCollection property when adding or removing rows. Ces méthodes effectuent le suivi des modifications qui sont nécessaire pour la mise à jour de la source de données.Those methods perform the change tracking that's needed for updating the data source. Si vous appelez le RemoveAt collection sur la propriété de lignes, la suppression ne sont pas communiquée à la base de données.If you call the RemoveAt collection on the Rows property, the deletion won't be communicated back to the database.

Fusionner les jeux de donnéesMerge datasets

Vous pouvez mettre à jour le contenu d’un jeu de données par fusion avec un autre jeu de données.You can update the contents of a dataset by merging it with another dataset. Cela implique la copie le contenu d’un source jeu de données dans le jeu de données appelant (appelé le cible jeu de données).This involves copying the contents of a source dataset into the calling dataset (referred to as the target dataset). Lorsque vous fusionnez des jeux de données, les nouveaux enregistrements dans le jeu de données source sont ajoutées au jeu de données cible.When you merge datasets, new records in the source dataset are added to the target dataset. En outre, les colonnes supplémentaires dans le jeu de données source sont ajoutées au jeu de données cible.Additionally, extra columns in the source dataset are added to the target dataset. Fusion de jeux de données est utile lorsque vous avez un jeu de données local et vous obtenez un deuxième jeu de données à partir d’une autre application.Merging datasets is useful when you have a local dataset and you get a second dataset from another application. Il est également utile lorsque vous recevez un deuxième jeu de données à partir d’un composant tel qu’un service web XML, ou lorsque vous avez besoin intégrer des données à partir de plusieurs jeux de données.It's also useful when you get a second dataset from a component such as an XML web service, or when you need to integrate data from multiple datasets.

Lors de la fusion des jeux de données, vous pouvez passer un argument booléen (preserveChanges) qui indique le Merge méthode s’il faut conserver les modifications existantes dans le jeu de données cible.When merging datasets, you can pass a Boolean argument (preserveChanges) that tells the Merge method whether to retain existing modifications in the target dataset. Étant donné que les jeux de données conserver plusieurs versions d’enregistrements, il est important de garder à l’esprit que plusieurs versions des enregistrements sont en cours de fusion.Because datasets maintain multiple versions of records, it's important to keep in mind that more than one version of the records is being merged. Le tableau suivant montre comment un enregistrement dans les deux jeux de données est fusionné :The following table shows how a record in two datasets is merged:

DataRowVersionDataRowVersion Dataset cibleTarget dataset Jeu de données sourceSource dataset
D'origineOriginal James WilsonJames Wilson James C. WilsonJames C. Wilson
ActuelCurrent Jim WilsonJim Wilson James C. WilsonJames C. Wilson

Appel de la Merge méthode sur le tableau précédent avec preserveChanges=false targetDataset.Merge(sourceDataset) entraîne les données suivantes :Calling the Merge method on the previous table with preserveChanges=false targetDataset.Merge(sourceDataset) results in the following data:

DataRowVersionDataRowVersion Dataset cibleTarget dataset Jeu de données sourceSource dataset
D'origineOriginal James C. WilsonJames C. Wilson James C. WilsonJames C. Wilson
ActuelCurrent James C. WilsonJames C. Wilson James C. WilsonJames C. Wilson

Appel de la Merge méthode avec preserveChanges = true targetDataset.Merge(sourceDataset, true) entraîne les données suivantes :Calling the Merge method with preserveChanges = true targetDataset.Merge(sourceDataset, true) results in the following data:

DataRowVersionDataRowVersion Dataset cibleTarget dataset Jeu de données sourceSource dataset
D'origineOriginal James C. WilsonJames C. Wilson James C. WilsonJames C. Wilson
ActuelCurrent Jim WilsonJim Wilson James C. WilsonJames C. Wilson

Caution

Dans le preserveChanges = true scénario, si le RejectChanges méthode est appelée sur un enregistrement dans le jeu de données cible, puis il revient aux données d’origine à partir de la source jeu de données.In the preserveChanges = true scenario, if the RejectChanges method is called on a record in the target dataset, then it reverts to the original data from the source dataset. Cela signifie que si vous essayez de mettre à jour de la source de données d’origine avec le jeu de données cible, il ne peut pas être en mesure de trouver la ligne d’origine pour mettre à jour.This means that if you try to update the original data source with the target dataset, it might not be able to find the original row to update. Vous pouvez empêcher une violation d’accès concurrentiel en remplissant un autre jeu de données avec les enregistrements mis à jour à partir de la source de données, puis exécutez une fusion pour éviter une violation d’accès concurrentiel.You can prevent a concurrency violation by filling another dataset with the updated records from the data source and then performing a merge to prevent a concurrency violation. (Une violation d’accès concurrentiel se produit lorsqu’un autre utilisateur modifie un enregistrement dans la source de données une fois que le jeu de données a été renseigné.)(A concurrency violation occurs when another user modifies a record in the data source after the dataset has been filled.)

Contraintes de mise à jourUpdate constraints

Pour apporter des modifications à une ligne de données existante, ajouter ou mettre à jour des données dans les colonnes individuelles.To make changes to an existing data row, add or update data in the individual columns. Si le jeu de données contient des contraintes (telles que les clés étrangères ou des contraintes non nullable), il est possible que l’enregistrement soit temporairement dans un état d’erreur quand vous mettez à jour.If the dataset contains constraints (such as foreign keys or non-nullable constraints), it's possible that the record can temporarily be in an error state as you update it. Autrement dit, il peut être dans un état d’erreur après avoir terminé la mise à jour d’une colonne, mais avant de passer à la suivante.That is, it can be in an error state after you finish updating one column but before you get to the next one.

Pour empêcher les violations de contrainte prématurées, vous pouvez interrompre temporairement les contraintes de mise à jour.To prevent premature constraint violations you can temporarily suspend update constraints. Cela a deux objectifs :This serves two purposes:

  • Il empêche une erreur ne soit levée une fois que vous avez terminé la mise à jour une colonne mais que vous n’avez pas commencé la mise à jour à un autre.It prevents an error from being thrown after you've finished updating one column but haven't started updating another.

  • Il empêche la mise à jour de certains événements ne soient pas déclenchés (les événements sont souvent utilisés pour la validation).It prevents certain update events from being raised (events that are often used for validation).

Note

Dans Windows Forms, l’architecture de liaison de données qui est intégrée à la grille de données interrompt la contrainte de vérification jusqu'à ce que le focus se déplace en dehors d’une ligne, et il est inutile d’appeler explicitement la BeginEdit, EndEdit, ou CancelEdit méthodes.In Windows Forms, the data binding architecture that's built into the datagrid suspends constraint checking until focus moves out of a row, and you do not have to explicitly call the BeginEdit, EndEdit, or CancelEdit methods.

Les contraintes sont automatiquement désactivées lorsque le Merge méthode est appelée sur un jeu de données.Constraints are automatically disabled when the Merge method is invoked on a dataset. Lorsque la fusion est terminée, s’il existe des contraintes sur le jeu de données qui ne peut pas être activée, un ConstraintException est levée.When the merge is complete, if there are any constraints on the dataset that cannot be enabled, a ConstraintException is thrown. Dans ce cas, le EnforceConstraints propriété est définie sur false, et toutes les violations de contrainte doivent être résolues avant de réinitialiser le EnforceConstraints propriété true.In this situation, the EnforceConstraints property is set to false, and all constraint violations must be resolved before resetting the EnforceConstraints property to true.

Après avoir effectué une mise à jour, vous pouvez réactiver la vérification des contraintes, ce qui active les événements de mise à jour de nouveau et déclenche également les.After you complete an update, you can re-enable constraint checking, which also re-enables update events and raises them.

Pour plus d’informations sur la suspension d’événements, consultez désactiver les contraintes pendant le remplissage d’un jeu de données.For more information about suspending events, see Turn off constraints while filling a dataset.

Erreurs de mise à jour de jeu de donnéesDataset update errors

Lorsque vous mettez à jour un enregistrement dans un jeu de données, il est possible d’une erreur.When you update a record in a dataset, there is the possibility of an error. Par exemple, vous pouvez par inadvertance écrire des données d’un type incorrect à une colonne, ou les données qui sont trop longues ou qui a un autre problème d’intégrité.For example, you might inadvertently write data of the wrong type to a column, or data that's too long, or data that has some other integrity problem. Ou bien, vous pouvez avoir des contrôles de validation de spécifique à l’application qui peuvent déclencher des erreurs personnalisées lors de n’importe quelle étape d’un événement de mise à jour.Or, you might have application-specific validation checks that can raise custom errors during any stage of an update event. Pour plus d’informations, consultez valider des données dans les jeux de données.For more information, see Validate data in datasets.

Mettre à jour les informations sur les modificationsMaintain information about changes

Informations sur les modifications dans un jeu de données sont gérées de deux manières : en marquant les lignes qui indiquent qu’ils ont été modifiés (RowState) et en conservant plusieurs copies d’un enregistrement (DataRowVersion).Information about the changes in a dataset is maintained in two ways: by flagging rows that indicate that they have changed (RowState), and by keeping multiple copies of a record (DataRowVersion). À l’aide de ces informations, le processus peuvent déterminer ce qui a changé dans le jeu de données et peuvent envoyer des mises à jour appropriées à la source de données.By using this information, processes can determine what has changed in the dataset and can send appropriate updates to the data source.

Propriété RowStateRowState property

Le RowState propriété d’un DataRow objet est une valeur qui fournit des informations sur l’état d’une ligne particulière de données.The RowState property of a DataRow object is a value that provides information about the status of a particular row of data.

Le tableau suivant détaille les valeurs possibles de la DataRowState énumération :The following table details the possible values of the DataRowState enumeration:

Valeur DataRowStateDataRowState Value DescriptionDescription
Added La ligne a été ajoutée en tant qu’élément à un DataRowCollection.The row has been added as an item to a DataRowCollection. (Une ligne dans cet état n’a pas une version d’origine correspondante dans la mesure où il n’existait pas lors de la dernière AcceptChanges méthode a été appelée).(A row in this state does not have a corresponding original version since it did not exist when the last AcceptChanges method was called).
Deleted La ligne a été supprimée à l’aide de la Delete d’un DataRow objet.The row was deleted using the Delete of a DataRow object.
Detached La ligne a été créée mais ne fait pas partie de n’importe quel DataRowCollection.The row has been created but is not part of any DataRowCollection. Un DataRow objet est dans cet état immédiatement après sa création, avant qu’il a été ajouté à une collection et après avoir été supprimée à partir d’une collection.A DataRow object is in this state immediately after it has been created, before it has been added to a collection, and after it has been removed from a collection.
Modified Une valeur de colonne dans la ligne a changé d’une certaine façon.A column value in the row has changed in some way.
Unchanged La ligne n’a pas changé depuis AcceptChanges dernier appel.The row has not changed since AcceptChanges was last called.

DataRowVersion (énumération)DataRowVersion enumeration

Jeux de données conserver plusieurs versions d’enregistrements.Datasets maintain multiple versions of records. Le DataRowVersion champs sont utilisés lors de la récupération de la valeur trouvée dans un DataRow à l’aide de la Item[String, DataRowVersion] propriété ou le GetChildRows méthode de la DataRow objet.The DataRowVersion fields are used when retrieving the value found in a DataRow using the Item[String, DataRowVersion] property or the GetChildRows method of the DataRow object.

Le tableau suivant détaille les valeurs possibles de la DataRowVersion énumération :The following table details the possible values of the DataRowVersion enumeration:

Valeur DataRowVersionDataRowVersion Value DescriptionDescription
Current La version actuelle d’un enregistrement contient toutes les modifications qui ont été effectuées sur l’enregistrement depuis la dernière fois AcceptChanges a été appelée.The current version of a record contains all modifications that have been performed on the record since the last time AcceptChanges was called. Si la ligne a été supprimée, il n’existe aucune version actuelle.If the row has been deleted, there is no current version.
Default La valeur par défaut d’un enregistrement, tel que défini par la source de schéma ou les données du jeu de données.The default value of a record, as defined by the dataset schema or data source.
Original La version d’origine d’un enregistrement est une copie de l’enregistrement comme c’était que les dernier enregistrement des modifications ont été validées dans le jeu de données.The original version of a record is a copy of the record as it was the last time changes were committed in the dataset. Dans la pratique, il s’agit généralement la version d’un enregistrement en lecture à partir d’une source de données.In practical terms, this is typically the version of a record as read from a data source.
Proposed La version proposée d’un enregistrement qui est disponible temporairement pendant que vous êtes au milieu d’une mise à jour, autrement dit, entre le moment où vous avez appelé la BeginEdit (méthode) et le EndEdit (méthode).The proposed version of a record that is available temporarily while you are in the middle of an update — that is, between the time you called the BeginEdit method and the EndEdit method. Vous en général accéder à la version proposée d’un enregistrement dans un gestionnaire pour un événement tel que RowChanging.You typically access the proposed version of a record in a handler for an event such as RowChanging. Appel de la CancelEdit méthode annule les modifications et supprime la version proposée de la ligne de données.Invoking the CancelEdit method reverses the changes and deletes the proposed version of the data row.

Les versions d’origine et actuelles sont utiles lorsque les informations de mise à jour sont transmises à une source de données.The original and current versions are useful when update information is transmitted to a data source. En règle générale, lorsqu’une mise à jour est envoyé à la source de données, les nouvelles informations de la base de données sont dans la version actuelle d’un enregistrement.Typically, when an update is sent to the data source, the new information for the database is in the current version of a record. Informations à partir de la version d’origine sont utilisées pour rechercher l’enregistrement à mettre à jour.Information from the original version is used to locate the record to update.

Par exemple, dans un cas où la clé primaire d’un enregistrement est modifiée, vous avez besoin d’un moyen de localiser l’enregistrement correct dans la source de données pour mettre à jour les modifications.For example, in a case where the primary key of a record is changed, you need a way to locate the correct record in the data source in order to update the changes. Si aucune version d’origine n’existe, l’enregistrement serait probablement être ajouté à la source de données, ce qui entraîne non seulement dans un enregistrement supplémentaire inutile, mais dans un seul enregistrement est inexact et obsolètes.If no original version existed, then the record would most likely be appended to the data source, resulting not only in an extra unwanted record, but in one record that is inaccurate and out of date. Les deux versions sont également utilisées dans le contrôle d’accès concurrentiel.The two versions are also used in concurrency control. Vous pouvez comparer la version d’origine par rapport à un enregistrement dans la source de données pour déterminer si l’enregistrement a changé depuis son chargement dans le jeu de données.You can compare the original version against a record in the data source to determine if the record has changed since it was loaded into the dataset.

La version proposée est utile lorsque vous avez besoin effectuer la validation avant validation réellement des modifications au jeu de données.The proposed version is useful when you need to perform validation before actually committing the changes to the dataset.

Même si les enregistrements ont été modifiés, il n'existe pas toujours des versions d’origine ou en cours de cette ligne.Even if records have changed, there are not always original or current versions of that row. Lorsque vous insérez une nouvelle ligne dans la table, il n’existe aucune version d’origine, seule une version actuelle.When you insert a new row into the table, there is no original version, only a current version. De même, si vous supprimez une ligne en appelant de la table Delete (méthode), il existe une version d’origine, mais aucune version actuelle.Similarly, if you delete a row by calling the table's Delete method, there is an original version, but no current version.

Vous pouvez tester pour voir si une version spécifique d’un enregistrement existe en interrogeant une ligne de données HasVersion (méthode).You can test to see if a specific version of a record exists by querying a data row's HasVersion method. Vous pouvez accéder à des versions d’un enregistrement en passant un DataRowVersion valeur d’énumération comme un argument facultatif lorsque vous demandez la valeur d’une colonne.You can access either version of a record by passing a DataRowVersion enumeration value as an optional argument when you request the value of a column.

Obtenir les enregistrements modifiésGet changed records

Il est une pratique courante ne pas mettre à jour chaque enregistrement dans un jeu de données.It's a common practice not to update every record in a dataset. Par exemple, un utilisateur peut utiliser un formulaire Windows DataGridView contrôle qui affiche le nombre d’enregistrements.For example, a user might be working with a Windows Forms DataGridView control that displays many records. Toutefois, l’utilisateur peut mettre à jour uniquement quelques enregistrements, supprimez l’une et insérer un nouveau.However, the user might update only a few records, delete one, and insert a new one. Jeux de données et tables de données fournissent une méthode (GetChanges) pour retourner uniquement les lignes qui ont été modifiées.Datasets and data tables provide a method (GetChanges) for returning only the rows that have been modified.

Vous pouvez créer des sous-ensembles d’enregistrements modifiés à l’aide de la GetChanges de la table de données (méthode) (GetChanges) ou du jeu de données (GetChanges) lui-même.You can create subsets of changed records using the GetChanges method of either the data table (GetChanges) or of the dataset (GetChanges) itself. Si vous appelez la méthode pour la table de données, il retourne une copie de la table contenant uniquement les enregistrements modifiés.If you call the method for the data table, it returns a copy of the table with only the changed records. De même, si vous appelez la méthode sur le jeu de données, vous obtenez un nouveau dataset avec uniquement les enregistrements modifiés.Similarly, if you call the method on the dataset, you get a new dataset with only changed records in it.

GetChanges par elle-même retourne tous les enregistrements modifiés.GetChanges by itself returns all changed records. En revanche, en passant le texte souhaité DataRowState en tant que paramètre à la GetChanges (méthode), vous pouvez spécifier le sous-ensemble d’enregistrements modifiés souhaité : nouvellement ajouté détaché d’enregistrements, enregistrements marqués pour suppression, enregistrements ou des enregistrements modifiés.In contrast, by passing the desired DataRowState as a parameter to the GetChanges method, you can specify what subset of changed records you want: newly added records, records that are marked for deletion, detached records, or modified records.

Obtention d’un sous-ensemble des enregistrements modifiés est utile lorsque vous souhaitez envoyer des enregistrements à un autre composant pour traitement.Getting a subset of changed records is useful when you want to send records to another component for processing. Au lieu d’envoyer l’ensemble du dataset, vous pouvez réduire la surcharge de la communication avec l’autre composant en récupérant uniquement les enregistrements dont le composant a besoin.Instead of sending the entire dataset, you can reduce the overhead of communicating with the other component by getting only the records that the component needs.

Valider les modifications dans le jeu de donnéesCommit changes in the dataset

Lorsque des modifications sont apportées dans le jeu de données, le RowState propriété des lignes modifiées est définie.As changes are made in the dataset, the RowState property of changed rows is set. Les versions d’origine et actuelles des enregistrements sont établies, conservées et mises à votre disposition par le RowVersion propriété.The original and current versions of records are established, maintained, and made available to you by the RowVersion property. Les métadonnées sont stockées dans les propriétés de ces lignes modifiées ne sont nécessaire pour envoyer les mises à jour correctes à la source de données.The metadata that's stored in the properties of these changed rows is necessary for sending the correct updates to the data source.

Si les modifications reflètent l’état actuel de la source de données, vous n’avez plus besoin de conserver ces informations.If the changes reflect the current state of the data source, you no longer need to maintain this information. En règle générale, voici les deux heures lorsque le jeu de données et sa source sont synchronisés :Typically, there are two times when the dataset and its source are in sync:

  • Immédiatement après le chargement des informations dans le jeu de données, telles que lorsque vous lisez des données à partir de la source.Immediately after you have loaded information into the dataset, such as when you read data from the source.

  • Après l’envoi des modifications du jeu de données à la source de données (mais pas avant, car vous perdrez les informations de modification qui sont nécessaire pour envoyer les modifications à la base de données).After sending changes from the dataset to the data source (but not before, because you would lose the change information that's required to send changes to the database).

Vous pouvez valider les modifications en attente pour le jeu de données en appelant le AcceptChanges (méthode).You can commit the pending changes to the dataset by calling the AcceptChanges method. En règle générale, AcceptChanges est appelées aux moments suivants :Typically, AcceptChanges is called at the following times:

  • Après avoir chargé le jeu de données.After you load the dataset. Si vous chargez un jeu de données en appelant d’un TableAdapter Fill (méthode), puis l’adaptateur valide automatiquement les modifications pour vous.If you load a dataset by calling a TableAdapter's Fill method, then the adapter automatically commits changes for you. Toutefois, si vous chargez un jeu de données en y fusionnant un autre jeu de données, vous devez valider les modifications manuellement.However, if you load a dataset by merging another dataset into it, then you have to commit the changes manually.

    Note

    Vous pouvez empêcher l’adaptateur de validation des modifications automatiquement lorsque vous appelez le Fill méthode en définissant le AcceptChangesDuringFill propriété de l’adaptateur à false.You can prevent the adapter from automatically committing the changes when you call the Fill method by setting the AcceptChangesDuringFill property of the adapter to false. Si elle est définie sur false, puis le RowState de chaque ligne est insérée lors du remplissage est définie sur Added.If it's set to false, then the RowState of each row that's inserted during the fill is set to Added.

  • Une fois que vous envoyez les modifications de jeu de données à un autre processus, comme un service web XML.After you send dataset changes to another process, such as an XML web service.

    Caution

    Validation de la modification de cette façon efface toutes les informations modifiées.Committing the change this way erases any change information. Ne pas valider les modifications jusqu'à ce qu’après avoir terminent des opérations nécessitant de votre application pour savoir quelles modifications ont été apportées dans le jeu de données.Do not commit changes until after you finish performing operations that require your application to know what changes have been made in the dataset.

Cette méthode effectue les opérations suivantes :This method accomplishes the following:

  • Écrit le Current version d’un enregistrement dans son Original version et remplace la version d’origine.Writes the Current version of a record into its Original version and overwrites the original version.

  • Supprime toute ligne où le RowState propriété est définie sur Deleted.Removes any row where the RowState property is set to Deleted.

  • Définit le RowState propriété d’un enregistrement à Unchanged.Sets the RowState property of a record to Unchanged.

Le AcceptChanges méthode est disponible à trois niveaux.The AcceptChanges method is available at three levels. Vous pouvez l’appeler sur un DataRow objet aux validations est modifié pour simplement cette ligne.You can call it on a DataRow object to commits changes for just that row. Vous pouvez également l’appeler sur un DataTable objet à valider toutes les lignes dans une table.You can also call it on a DataTable object to commit all rows in a table. Enfin, vous pouvez l’appeler sur le DataSet objet à valider toutes les modifications en attente dans tous les enregistrements de toutes les tables du jeu de données.Finally, you can call it on the DataSet object to commit all pending changes in all records of all tables of the dataset.

Le tableau suivant décrit les modifications sont validées selon ce que la méthode est appelée sur l’objet :The following table describes which changes are committed based on what object the method is called on:

MéthodeMethod RésultatResult
System.Data.DataRow.AcceptChanges Les modifications sont validées uniquement sur la ligne spécifique.Changes are committed only on the specific row.
System.Data.DataTable.AcceptChanges Les modifications sont validées sur toutes les lignes dans la table spécifique.Changes are committed on all rows in the specific table.
System.Data.DataSet.AcceptChanges Les modifications sont validées sur toutes les lignes de toutes les tables du jeu de données.Changes are committed on all rows in all tables of the dataset.

Note

Si vous chargez un jeu de données en appelant d’un TableAdapter Fill (méthode), vous ne devez accepter explicitement les modifications.If you load a dataset by calling a TableAdapter's Fill method, you don't have to explicitly accept changes. Par défaut, le Fill les appels de méthode le AcceptChanges méthode après son remplissage de la table de données.By default, the Fill method calls the AcceptChanges method after it finishes populating the data table.

Une méthode associée, RejectChanges, annule les modifications en copiant le Original version dans le Current version d’enregistrements.A related method, RejectChanges, undoes the effect of changes by copying the Original version back into the Current version of records. Il définit également la RowState de chaque enregistrement à Unchanged.It also sets the RowState of each record back to Unchanged.

Validation des donnéesData validation

Afin de vérifier que les données dans votre application répond aux exigences des processus qui elle est passée à, vous devez souvent ajouter la validation.In order to verify that the data in your application meets the requirements of the processes that it is passed to, you often have to add validation. Cela peut impliquer la vérification que l’entrée d’utilisateur dans un formulaire est correcte, validation des données qui sont envoyées à votre application par une autre application, ou même vérifier que les informations qui sont calculées au sein de votre composant se trouve dans les contraintes de votre source de données et les exigences de l’application.This might involve checking that a user's entry in a form is correct, validating data that's sent to your application by another application, or even checking that information that's calculated within your component falls within the constraints of your data source and application requirements.

Vous pouvez valider les données de plusieurs manières :You can validate data in several ways:

  • Dans la couche métier, en ajoutant du code à votre application pour valider les données.In the business layer, by adding code to your application to validate data. Le jeu de données est un seul endroit, vous pouvez le faire.The dataset is one place you can do this. Le jeu de données fournit quelques-uns des avantages de la validation de serveur principal, telles que la capacité à valider les modifications que la modifiant des valeurs de colonne et de ligne.The dataset provides some of the advantages of back-end validation — such as the ability to validate changes as column and row values are changing. Pour plus d’informations, consultez valider des données dans les jeux de données.For more information, see Validate data in datasets.

  • Dans la couche de présentation, en ajoutant la validation aux formulaires.In the presentation layer, by adding validation to forms. Pour plus d’informations, consultez validation dans les Windows Forms des entrées utilisateur.For more information, see User input validation in Windows Forms.

  • Dans les données back-end, en envoyant des données à la source de données, par exemple, la base de données et en l’autorisant à accepter ou refuser les données.In the data back end, by sending data to the data source — for example, the database — and allowing it to accept or reject the data. Si vous travaillez avec une base de données qui a des fonctionnalités évoluées de validation des données et fournir des informations d’erreur, cela peut être une approche pratique, car vous pouvez valider les données, quel que soit l’emplacement d’origine.If you are working with a database that has sophisticated facilities for validating data and providing error information, this can be a practical approach because you can validate the data no matter where it comes from. Toutefois, cette approche ne peut pas satisfaire les exigences de la validation spécifique à l’application.However, this approach might not accommodate application-specific validation requirements. En outre, la source de données valider des données peut entraîner de nombreux allers-retours vers la source de données, en fonction de la façon dont votre application facilite la résolution des erreurs de validation déclenchés par le serveur principal.Additionally, having the data source validate data can result in numerous round trips to the data source, depending on how your application facilitates the resolution of validation errors raised by the back end.

    Important

    Lorsque vous utilisez les commandes de données avec un CommandType propriété a la valeur Text, soigneusement vérifier les informations qui sont envoyées à partir d’un client avant de le transmettre à votre base de données.When using data commands with a CommandType property that's set to Text, carefully check information that is sent from a client before passing it to your database. Les utilisateurs malveillants peuvent tenter d’envoyer (injecter) des instructions SQL modifiées ou supplémentaires dans le but d’obtenir un accès non autorisé ou d’endommager la base de données.Malicious users might try to send (inject) modified or additional SQL statements in an effort to gain unauthorized access or damage the database. Avant de transférer l’entrée utilisateur et une base de données, vérifiez toujours que les informations sont valides.Before you transfer user input to a database, always verify that the information is valid. Il est recommandé de toujours utiliser des requêtes paramétrables ou les procédures stockées lorsque cela est possible.It's a best practice to always use parameterized queries or stored procedures when possible.

Transmettre les mises à jour de la source de donnéesTransmit updates to the data source

Une fois que les modifications ont été apportées dans un jeu de données, vous pouvez transmettre les modifications apportées à une source de données.After changes have been made in a dataset, you can transmit the changes to a data source. En règle générale, ce faire, appelez le Update méthode d’un TableAdapter (ou adaptateur de données).Most commonly, you do this by calling the Update method of a TableAdapter (or data adapter). La méthode parcourt chaque enregistrement dans une table de données détermine quel type de mise à jour est nécessaire (update, insert ou delete), le cas échéant, puis exécute la commande appropriée.The method loops through each record in a data table, determines what type of update is required (update, insert, or delete), if any, and then runs the appropriate command.

En guise d’illustration de la façon dont les mises à jour sont effectuées, supposons que votre application utilise un jeu de données qui contient une table de données unique.As an illustration of how updates are made, suppose your application uses a dataset that contains a single data table. L’application extrait les deux lignes de la base de données.The application fetches two rows from the database. Après la récupération, la table de données en mémoire ressemble à ceci :After the retrieval, the in-memory data table looks like this:

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Unchanged)    c400         Nancy Buchanan    Pending

Votre application change le statut de Nancy Buchanan « Favoris ».Your application changes Nancy Buchanan's status to "Preferred." Suite à cette modification, la valeur de la RowState propriété pour cette ligne passe de Unchanged à Modified.As a result of this change, the value of the RowState property for that row changes from Unchanged to Modified. La valeur de la RowState propriété pour la première ligne reste Unchanged.The value of the RowState property for the first row remains Unchanged. La table de données ressemble maintenant à ceci :The data table now looks like this:

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Modified)     c400         Nancy Buchanan    Preferred

Votre application maintenant appelle le Update méthode pour transmettre le jeu de données à la base de données.Your application now calls the Update method to transmit the dataset to the database. La méthode inspecte chaque ligne à son tour.The method inspects each row in turn. Pour la première ligne, la méthode ne transmet aucun instruction SQL à la base de données, car cette ligne n’a pas changé dans la mesure où il a été récupérée à l’origine à partir de la base de données.For the first row, the method transmits no SQL statement to the database because that row has not changed since it was originally fetched from the database.

Pour la deuxième ligne, la Update méthode appelle la commande de données correcte et transmet à la base de données automatiquement.For the second row, however, the Update method automatically invokes the correct data command and transmits it to the database. La syntaxe de l’instruction SQL spécifique varie selon le dialecte SQL qui est pris en charge par le magasin de données sous-jacent.The specific syntax of the SQL statement depends on the dialect of SQL that's supported by the underlying data store. Toutefois, les caractéristiques suivantes de l’instruction SQL transmise sont dignes d’intérêt :But, the following general traits of the transmitted SQL statement are noteworthy:

  • L’instruction SQL transmise est une instruction de mise à jour.The transmitted SQL statement is an UPDATE statement. L’adaptateur sait qu’il doit pour utiliser une instruction UPDATE, car la valeur de la RowState propriété est Modified.The adapter knows to use an UPDATE statement because the value of the RowState property is Modified.

  • L’instruction SQL transmise comprend une clause WHERE indiquant que la cible de l’instruction UPDATE est la ligne où CustomerID = 'c400'.The transmitted SQL statement includes a WHERE clause indicating that the target of the UPDATE statement is the row where CustomerID = 'c400'. Cette partie de l’instruction SELECT distingue la ligne cible des autres, car le CustomerID est la clé primaire de la table cible.This part of the SELECT statement distinguishes the target row from all others because the CustomerID is the primary key of the target table. Les informations de la clause WHERE est dérivée de la version d’origine de l’enregistrement (DataRowVersion.Original), au cas où les valeurs qui sont nécessaires pour identifier la ligne ont été modifiés.The information for the WHERE clause is derived from the original version of the record (DataRowVersion.Original), in case the values that are required to identify the row have changed.

  • L’instruction SQL transmise inclut la clause SET pour définir les nouvelles valeurs des colonnes modifiées.The transmitted SQL statement includes the SET clause, to set the new values of the modified columns.

    Note

    Si le TableAdapter UpdateCommand propriété a été définie sur le nom d’une procédure stockée, l’adaptateur ne construit pas une instruction SQL.If the TableAdapter's UpdateCommand property has been set to the name of a stored procedure, the adapter does not construct an SQL statement. Au lieu de cela, elle appelle la procédure stockée avec les paramètres passés dans appropriés.Instead, it invokes the stored procedure with the appropriate parameters passed in.

Passer des paramètresPass parameters

Vous utilisez généralement des paramètres pour passer les valeurs pour les enregistrements qui vont être mis à jour dans la base de données.You usually use parameters to pass the values for records that are going to be updated in the database. Lorsque le TableAdapter Update méthode exécute une instruction de mise à jour, il doit remplir les valeurs de paramètre.When the TableAdapter's Update method runs an UPDATE statement, it needs to fill in the parameter values. Ces valeurs sont obtenues à partir de la Parameters collection pour la commande de données approprié, dans ce cas, le UpdateCommand objet dans le TableAdapter.It gets these values from the Parameters collection for the appropriate data command — in this case, the UpdateCommand object in the TableAdapter.

Si vous avez utilisé les outils Visual Studio pour générer un adaptateur de données, le UpdateCommand objet constituée une collection de paramètres correspondant à chaque espace réservé de paramètre dans l’instruction.If you've used the Visual Studio tools to generate a data adapter, the UpdateCommand object contains a collection of parameters that correspond to each parameter placeholder in the statement.

Le System.Data.SqlClient.SqlParameter.SourceColumn propriété de chaque paramètre pointe vers une colonne dans la table de données.The System.Data.SqlClient.SqlParameter.SourceColumn property of each parameter points to a column in the data table. Par exemple, le SourceColumn propriété pour le au_id et Original_au_id paramètres est définie sur la colonne dans la table de données contenant l’id de l’auteur. Lorsque l’adaptateur Update exécutions de méthode, il lit l’auteur de colonne d’id de l’enregistrement est mis à jour et remplit les valeurs dans l’instruction.For example, the SourceColumn property for the au_id and Original_au_id parameters is set to whatever column in the data table contains the author id. When the adapter's Update method runs, it reads the author id column from the record that's being updated and fills the values into the statement.

Dans une instruction de mise à jour, vous devez spécifier les nouvelles valeurs (celles qui sont écrits dans l’enregistrement), ainsi que les anciennes valeurs (de sorte que l’enregistrement peut se trouver dans la base de données).In an UPDATE statement, you need to specify both the new values (those that will be written to the record) as well as the old values (so that the record can be located in the database). Il existe, par conséquent, deux paramètres pour chaque valeur : un pour la clause SET et un autre pour la clause WHERE.There are, therefore, two parameters for each value: one for the SET clause and a different one for the WHERE clause. Les deux paramètres lisent les données à partir de l’enregistrement est mis à jour, mais ils obtiennent des versions différentes de la valeur de colonne en fonction du paramètre SourceVersion propriété.Both parameters read data from the record that's being updated, but they get different versions of the column value based on the parameter's SourceVersion property. Le paramètre pour la clause SET obtient la version actuelle, et le paramètre pour la clause WHERE obtient la version d’origine.The parameter for the SET clause gets the current version, and the parameter for the WHERE clause gets the original version.

Note

Vous pouvez également définir des valeurs le Parameters collection vous-même dans le code que vous le feriez en général dans un gestionnaire d’événements pour l’adaptateur de données RowChanging événement.You can also set values in the Parameters collection yourself in code, which you would typically do in an event handler for the data adapter's RowChanging event.

Voir aussiSee also