Valider des données dans les jeux de donnéesValidate data in datasets

Validation des données est le processus consistant à confirmer que les valeurs entrées dans des objets de données sont conformes aux contraintes de schéma d’un jeu de données.Validating data is the process of confirming that the values being entered into data objects conform to the constraints within a dataset's schema. Le processus de validation vérifie également que ces valeurs sont les suivantes : les règles qui ont été établies pour votre application.The validation process also confirms that these values are following the rules that have been established for your application. Il est conseillé de valider les données avant d’envoyer des mises à jour à la base de données sous-jacente.It's a good practice to validate data prior to sending updates to the underlying database. Cela réduit les erreurs, ainsi que le nombre potentiel d’allers-retours entre une application et la base de données.This reduces errors as well as the potential number of round trips between an application and the database.

Vous pouvez vérifier que les données sont écrites dans un jeu de données sont valides en créant des contrôles de validation dans le jeu de données.You can confirm that data that's being written to a dataset is valid by building validation checks into the dataset itself. Le jeu de données peut vérifier les données, quel que soit la façon dont la mise à jour est effectuée, que ce soit directement par les contrôles dans un formulaire, au sein d’un composant, ou d’une autre manière.The dataset can check the data no matter how the update is being performed — whether directly by controls in a form, within a component, or in some other way. Étant donné que le jeu de données fait partie de votre application (contrairement à la base de données principale), il est un emplacement logique pour générer une validation spécifique à l’application.Because the dataset is part of your application (unlike the database backend), it's a logical place to build application-specific validation.

Il est le meilleur endroit pour ajouter une validation à votre application dans le fichier de classe partielle du groupe de données.The best place to add validation to your application is in the dataset's partial class file. Dans Visual BasicVisual Basic ou Visual C#Visual C#, ouvrez le Concepteur de Dataset et double-cliquez sur la colonne ou la table pour laquelle vous souhaitez créer la validation.In Visual BasicVisual Basic or Visual C#Visual C#, open the Dataset Designer and double-click the column or table for which you want to create validation. Cette action crée automatiquement un ColumnChanging ou RowChanging Gestionnaire d’événements.This action automatically creates an ColumnChanging or RowChanging event handler.

Valider des donnéesValidate data

Validation au sein d’un jeu de données peut être accomplie de plusieurs façons :Validation within a dataset can be accomplished in the following ways:

Plusieurs événements sont déclenchés par le DataTable lorsqu’une modification est apportée à un enregistrement de l’objet :Several events are raised by the DataTable object when a change is occurring in a record:

  • Le ColumnChanging et ColumnChanged sont déclenchés pendant et après chaque modification apportée à une colonne individuelle.The ColumnChanging and ColumnChanged events are raised during and after each change to an individual column. Le ColumnChanging événement est utile lorsque vous souhaitez valider les modifications apportées dans des colonnes spécifiques.The ColumnChanging event is useful when you want to validate changes in specific columns. Plus d’informations sur la modification proposée sont passés en tant qu’argument à l’événement.Information about the proposed change is passed as an argument with the event.
  • Le RowChanging et RowChanged sont déclenchés pendant et après chaque modification d’une ligne.The RowChanging and RowChanged events are raised during and after any change in a row. Le RowChanging événement est plus général.The RowChanging event is more general. Il indique qu’une modification se produit quelque part dans la ligne, mais vous ne savez pas quelle colonne a changé.It indicates that a change is occurring somewhere in the row, but you don't know which column has changed.

Par défaut, chaque modification de colonne déclenche donc quatre événements.By default, each change to a column therefore raises four events. La première est la ColumnChanging et ColumnChanged événements pour la colonne qui est en cours de modification.The first is the ColumnChanging and ColumnChanged events for the specific column that's being changed. Sont ensuite le RowChanging et RowChanged les événements.Next are the RowChanging and RowChanged events. Si plusieurs modifications sont en cours apportées à la ligne, les événements sont déclenchés pour chaque modification.If multiple changes are being made to the row, the events will be raised for each change.

Note

La ligne de données BeginEdit méthode désactive le RowChanging et RowChanged événements après chaque modification de colonne individuelle.The data row's BeginEdit method turns off the RowChanging and RowChanged events after each individual column change. Dans ce cas, l’événement n’est pas déclenché jusqu'à ce que le EndEdit méthode a été appelée, lorsque le RowChanging et RowChanged sont déclenchés une seule fois.In that case, the event is not raised until the EndEdit method has been called, when the RowChanging and RowChanged events are raised just once. 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.

L’événement que vous choisissez dépend du niveau de granularité que vous souhaitez la validation doit être.The event you choose depends on how granular you want the validation to be. S’il est important que vous interceptez une erreur immédiatement lors d’une colonne change, générez la validation à l’aide de la ColumnChanging événement.If it's important that you catch an error immediately when a column changes, build validation by using the ColumnChanging event. Sinon, utilisez le RowChanging événement, ce qui peut entraîner l’interception de plusieurs erreurs à la fois.Otherwise, use the RowChanging event, which might result in catching several errors at once. En outre, si vos données sont structurées de sorte que la valeur d’une colonne est validée en fonction du contenu d’une autre colonne, puis effectuer votre validation pendant la RowChanging événement.Additionally, if your data is structured so that the value of one column is validated based on the contents of another column, then perform your validation during the RowChanging event.

Lorsque les enregistrements sont mis à jour, le DataTable objet déclenche des événements que vous pouvez répondre pendant et après des modifications sont apportées.When records are updated, the DataTable object raises events that you can respond to as changes are occurring and after changes are made.

Si votre application utilise un dataset typé, vous pouvez créer des gestionnaires d’événements fortement typés.If your application uses a typed dataset, you can create strongly typed event handlers. Cela ajoutera quatre événements typés supplémentaires que vous pouvez créer des gestionnaires pour : dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeleting, et dataTableNameRowDeleted.This will add four additional typed events that you can create handlers for: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeleting, and dataTableNameRowDeleted. Ces gestionnaires d’événements typés passent un argument qui inclut les noms de colonnes de votre table qui simplifient le code écrire et lire.These typed event handlers pass an argument that includes the column names of your table that make code easier to write and read.

Événements de mise à jour de donnéesData update events

événementEvent DescriptionDescription
ColumnChanging La valeur dans une colonne est en cours de modification.The value in a column is being changed. L’événement passe la ligne et colonne, ainsi que la nouvelle valeur proposée.The event passes the row and column to you, along with the proposed new value.
ColumnChanged La valeur dans une colonne a été modifiée.The value in a column has been changed. L’événement passe la ligne et colonne, ainsi que la valeur proposée.The event passes the row and column to you, along with the proposed value.
RowChanging Les modifications apportées à un DataRow objet sont sur le point d’être validées dans le jeu de données.The changes that were made to a DataRow object are about to be committed back into the dataset. Si vous n’avez pas appelé la BeginEdit (méthode), la RowChanging événement est déclenché pour chaque modification apportée à une colonne immédiatement après le ColumnChanging événement a été déclenché.If you have not called the BeginEdit method, the RowChanging event is raised for each change to a column immediately after the ColumnChanging event has been raised. Si vous avez appelé BeginEdit avant d’apporter des modifications, la RowChanging événement est déclenché uniquement lorsque vous appelez le EndEdit (méthode).If you called BeginEdit before making changes, the RowChanging event is raised only when you call the EndEdit method.

L’événement passe la ligne, ainsi qu’une valeur qui indique le type d’action (modification, insertion et ainsi de suite) est en cours d’exécution.The event passes the row to you, along with a value indicating what type of action (change, insert, and so on) is being performed.
RowChanged Une ligne a été modifiée.A row has been changed. L’événement passe la ligne, ainsi qu’une valeur qui indique le type d’action (modification, insertion et ainsi de suite) est en cours d’exécution.The event passes the row to you, along with a value indicating what type of action (change, insert, and so on) is being performed.
RowDeleting Une ligne est en cours de suppression.A row is being deleted. L’événement passe la ligne, ainsi qu’une valeur qui indique le type d’action (delete) est en cours d’exécution.The event passes the row to you, along with a value indicating what type of action (delete) is being performed.
RowDeleted Une ligne a été supprimée.A row has been deleted. L’événement passe la ligne, ainsi qu’une valeur qui indique le type d’action (delete) est en cours d’exécution.The event passes the row to you, along with a value indicating what type of action (delete) is being performed.

Le ColumnChanging, RowChanging, et RowDeleting sont déclenchés pendant le processus de mise à jour.The ColumnChanging, RowChanging, and RowDeleting events are raised during the update process. Vous pouvez utiliser ces événements pour valider les données ou effectuer d’autres types de traitement.You can use these events to validate data or perform other types of processing. Étant donné que la mise à jour est en cours pendant ces événements, vous pouvez l’annuler en levant une exception, ce qui empêche la mise à jour de fin.Because the update is in process during these events, you can cancel it by throwing an exception, which prevents the update from finishing.

Le ColumnChanged, RowChanged et RowDeleted événements sont des événements de notification qui sont déclenchés lorsque la mise à jour terminée avec succès.The ColumnChanged, RowChanged and RowDeleted events are notification events that are raised when the update has finished successfully. Ces événements sont utiles lorsque vous souhaitez prendre des mesures en fonction de la mise à jour.These events are useful when you want to take further action based on a successful update.

Valider les données pendant la modification de colonneValidate data during column changes

Note

Le Concepteur de Dataset crée une classe partielle dans laquelle le contrôle logique peut être ajoutée à un dataset.The Dataset Designer creates a partial class in which validation logic can be added to a dataset. Le jeu de données généré par le concepteur ne supprimez ou modifiez tout code dans la classe partielle.The designer-generated dataset doesn't delete or change any code in the partial class.

Vous pouvez valider les données lorsque la valeur dans une colonne de données change en réponse à la ColumnChanging événement.You can validate data when the value in a data column changes by responding to the ColumnChanging event. Lorsque déclenché, cet événement passe un argument d’événement (ProposedValue) qui contient la valeur qui est proposée pour la colonne actuelle.When raised, this event passes an event argument (ProposedValue) that contains the value that's being proposed for the current column. En fonction du contenu de e.ProposedValue, vous pouvez :Based on the contents of e.ProposedValue, you can:

  • Acceptez la valeur proposée par ne rien faire.Accept the proposed value by doing nothing.

  • Refuser la valeur proposée en définissant l’erreur de colonne (SetColumnError) à partir de gestionnaire d’événements de modification de colonne.Reject the proposed value by setting the column error (SetColumnError) from within the column-changing event handler.

  • Vous pouvez également utiliser un ErrorProvider contrôle pour afficher un message d’erreur à l’utilisateur.Optionally use an ErrorProvider control to display an error message to the user. Pour plus d’informations, consultez du composant ErrorProvider.For more information, see ErrorProvider Component.

La validation peut également être effectuée pendant la RowChanging événement.Validation can also be performed during the RowChanging event.

Valider les données pendant la modification de ligneValidate data during row changes

Vous pouvez écrire du code pour vérifier que chaque colonne que vous souhaitez valider contient des données répondant aux exigences de votre application.You can write code to verify that each column you want to validate contains data that meets the requirements of your application. Cela en définissant la colonne pour indiquer qu’il contient une erreur si une valeur proposée est inacceptable.Do this by setting the column to indicate that it contains an error if a proposed value is unacceptable. Les exemples suivants définissent une erreur de colonne lorsque la Quantity colonne est inférieur ou égal à 0.The following examples set a column error when the Quantity column is 0 or less. Les gestionnaires d’événements de modification de ligne doivent ressembler à la procédure ci-après.The row-changing event handlers should resemble the following examples.

Pour valider des données lorsqu’une ligne change (Visual Basic)To validate data when a row changes (Visual Basic)

  1. Ouvrez votre dataset dans le Concepteur de Dataset.Open your dataset in the Dataset Designer. Pour plus d’informations, consultez procédure pas à pas : création d’un jeu de données dans le Concepteur de Dataset.For more information, see Walkthrough: Creating a Dataset in the Dataset Designer.

  2. Double-cliquez sur la barre de titre de la table que vous souhaitez valider.Double-click the title bar of the table you want to validate. Cette action crée automatiquement le RowChanging Gestionnaire d’événements de la DataTable dans le fichier de classe partielle du groupe de données.This action automatically creates the RowChanging event handler of the DataTable in the dataset's partial-class file.

    Conseil

    Double-cliquez à gauche du nom de table pour créer le Gestionnaire des événements de modification de ligne.Double-click to the left of the table name to create the row-changing event handler. Si vous double-cliquez sur le nom de table, vous pouvez le modifier.If you double-click the table name, you can edit it.

    Private Sub Order_DetailsDataTable_Order_DetailsRowChanging(
        ByVal sender As System.Object, 
        ByVal e As Order_DetailsRowChangeEvent
      ) Handles Me.Order_DetailsRowChanging
    
        If CType(e.Row.Quantity, Short) <= 0 Then
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError("Quantity", "")
        End If
    End Sub
    

Pour valider les données lors de la ligne change (c#)To validate data when a row changes (C#)

  1. Ouvrez votre dataset dans le Concepteur de Dataset.Open your dataset in the Dataset Designer. Pour plus d’informations, consultez procédure pas à pas : création d’un jeu de données dans le Concepteur de dataset.For more information, see Walkthrough: Creating a dataset in the dataset designer.

  2. Double-cliquez sur la barre de titre de la table que vous souhaitez valider.Double-click the title bar of the table you want to validate. Cette action crée un fichier de classe partielle pour le DataTable.This action creates a partial-class file for the DataTable.

    Note

    Le Concepteur de Dataset ne crée pas automatiquement un gestionnaire d’événements pour le RowChanging événement.The Dataset Designer does not automatically create an event handler for the RowChanging event. Vous devez créer une méthode pour gérer les RowChanging événement et exécuter du code pour raccorder l’événement dans la méthode d’initialisation de la table.You have to create a method to handle the RowChanging event, and run code to hook up the event in the table's initialization method.

  3. Copiez le code suivant dans la classe partielle :Copy the following code into the partial class:

    public override void EndInit()
    {
        base.EndInit();
        Order_DetailsRowChanging += TestRowChangeEvent;
    }
    
    public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e)
    {
        if ((short)e.Row.Quantity <= 0)
        {
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
        }
        else
        {
            e.Row.SetColumnError("Quantity", "");
        }
    }
    

Pour extraire des lignes modifiéesTo retrieve changed rows

Chaque ligne dans une table de données a un RowState propriété qui effectue le suivi de l’état actuel de cette ligne en utilisant les valeurs dans le DataRowState énumération.Each row in a data table has a RowState property that keeps track of the current state of that row by using the values in the DataRowState enumeration. Vous pouvez retourner des lignes modifiées d’une table de données ou du jeu de données en appelant le GetChanges méthode d’un DataSet ou DataTable.You can return changed rows from a dataset or data table by calling the GetChanges method of a DataSet or DataTable. Vous pouvez vérifier qu’il existe des modifications avant d’appeler GetChanges en appelant le HasChanges méthode d’un dataset.You can verify that changes exist prior to calling GetChanges by calling the HasChanges method of a dataset.

Note

Une fois que vous validez des modifications à une table de données ou du jeu de données (en appelant le AcceptChanges méthode), la GetChanges méthode ne retourne aucune donnée.After you commit changes to a dataset or data table (by calling the AcceptChanges method), the GetChanges method returns no data. Si votre application doit traiter des lignes modifiées, vous devez traiter les modifications avant d’appeler le AcceptChanges (méthode).If your application needs to process changed rows, you must process the changes before calling the AcceptChanges method.

Appel de la GetChanges méthode d’une table de données ou du jeu de données retourne une nouvelle table de données ou du jeu de données qui contient uniquement les enregistrements qui ont été modifiés.Calling the GetChanges method of a dataset or data table returns a new dataset or data table that contains only records that have been changed. Si vous souhaitez obtenir les enregistrements spécifiques : par exemple, que les nouveaux enregistrements ou les enregistrements modifiés, vous pouvez passer une valeur à partir de la DataRowState énumération en tant que paramètre à la GetChanges (méthode).If you want to get specific records — for example, only new records or only modified records — you can pass a value from the DataRowState enumeration as a parameter to the GetChanges method.

Utilisez le DataRowVersion énumération pour accéder aux différentes versions d’une ligne (par exemple, les valeurs d’origine se trouvaient dans une ligne avant de le traiter).Use the DataRowVersion enumeration to access the different versions of a row (for example, the original values that were in a row prior to processing it).

Pour obtenir tous les enregistrements modifiés à partir d’un jeu de donnéesTo get all changed records from a dataset

  • Appelez le GetChanges méthode d’un dataset.Call the GetChanges method of a dataset.

    L’exemple suivant crée un nouveau dataset appelé changedRecords et la remplit avec tous les enregistrements modifiés d’un autre dataset appelé dataSet1.The following example creates a new dataset called changedRecords and populates it with all the changed records from another dataset called dataSet1.

    DataSet changedRecords = dataSet1.GetChanges();
    
    Dim changedRecords As DataSet = DataSet1.GetChanges()
    

Pour obtenir tous les enregistrements modifiés à partir d’une table de donnéesTo get all changed records from a data table

  • Appelez le GetChanges méthode d’un DataTable.Call the GetChanges method of a DataTable.

    L’exemple suivant crée une nouvelle table de données appelée changedRecordsTable et la remplit avec tous les enregistrements modifiés d’une autre table de données appelée dataTable1.The following example creates a new data table called changedRecordsTable and populates it with all the changed records from another data table called dataTable1.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    
    Dim changedRecordsTable As DataTable = dataTable1.GetChanges()
    

Pour obtenir tous les enregistrements qui ont un état de ligne spécifiqueTo get all records that have a specific row state

  • Appelez le GetChanges (méthode) d’un jeu de données ou la table de données et le passe un DataRowState valeur d’énumération en tant qu’argument.Call the GetChanges method of a dataset or data table and pass a DataRowState enumeration value as an argument.

    L’exemple suivant montre comment créer un nouveau dataset appelé addedRecords et le remplir uniquement avec les enregistrements qui ont été ajoutés à la dataSet1 jeu de données.The following example shows how to create a new dataset called addedRecords and populate it only with records that have been added to the dataSet1 dataset.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    
    Dim addedRecords As DataSet = DataSet1.GetChanges(DataRowState.Added)
    

    L’exemple suivant montre comment retourner tous les enregistrements qui ont été récemment ajoutés à la Customers table :The following example shows how to return all records that were recently added to the Customers table:

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    
    Private Function GetNewRecords() As NorthwindDataSet.CustomersDataTable
    
        Return CType(NorthwindDataSet1.Customers.GetChanges(Data.DataRowState.Added),
            NorthwindDataSet.CustomersDataTable)
    End Function
    

Accéder à la version d’origine d’un DataRowAccess the original version of a DataRow

Lorsque des modifications sont apportées aux lignes de données, le jeu de données conserve les deux d’origine (Original) et new (Current) versions de la ligne.When changes are made to data rows, the dataset retains both the original (Original) and new (Current) versions of the row. Par exemple, avant d’appeler le AcceptChanges (méthode), votre application peut accéder les différentes versions d’un enregistrement (tel que défini dans le DataRowVersion énumération) et traiter les modifications en conséquence.For example, before calling the AcceptChanges method, your application can access the different versions of a record (as defined in the DataRowVersion enumeration) and process the changes accordingly.

Note

Différentes versions d’une ligne existent uniquement une fois qu’il a été modifié et avant la AcceptChanges méthode a été appelée.Different versions of a row exist only after it has been edited and before it the AcceptChanges method has been called. Après le AcceptChanges méthode a été appelée, les versions d’origine et actuelle sont identiques.After the AcceptChanges method has been called, the current and original versions are the same.

En passant le DataRowVersion valeur ainsi que l’index de colonne (ou le nom de la colonne sous forme de chaîne) retourne la valeur de la version de ligne spécifique de cette colonne.Passing the DataRowVersion value along with the column index (or column name as a string) returns the value from that column's particular row version. La colonne modifiée est identifiée pendant le ColumnChanging et ColumnChanged les événements.The changed column is identified during the ColumnChanging and ColumnChanged events. Il est judicieux d’examiner les différentes versions de ligne à des fins de validation.This is a good time to inspect the different row versions for validation purposes. Toutefois, si vous avez suspendu temporairement les contraintes, ces événements ne sont pas déclenchés et vous devrez par programmation identifier les colonnes qui ont été modifiés.However, if you have temporarily suspended constraints, those events won't be raised, and you will need to programmatically identify which columns have changed. Ce faire, vous pouvez itérer au sein du Columns collection et en comparant les différentes DataRowVersion valeurs.You can do this by iterating through the Columns collection and comparing the different DataRowVersion values.

Pour obtenir la version d’origine d’un enregistrementTo get the original version of a record

  • Accéder à la valeur d’une colonne en passant le DataRowVersion de la ligne que vous souhaitez retourner.Access the value of a column by passing in the DataRowVersion of the row you want to return.

    L’exemple suivant montre comment utiliser un DataRowVersion valeur à obtenir la valeur d’origine d’un CompanyName champ dans un DataRow:The following example shows how to use a DataRowVersion value to get the original value of a CompanyName field in a DataRow:

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    
    Dim originalCompanyName = NorthwindDataSet1.Customers(0)(
       "CompanyName", DataRowVersion.Original).ToString()
    

Accéder à la version actuelle d’un DataRowAccess the current version of a DataRow

Pour obtenir la version actuelle d’un enregistrementTo get the current version of a record

  • Accéder à la valeur d’une colonne, puis ajouter un paramètre à l’index qui indique quelle version d’une ligne que vous souhaitez retourner.Access the value of a column, and then add a parameter to the index that indicates which version of a row you want to return.

    L’exemple suivant montre comment utiliser un DataRowVersion pour obtenir la valeur actuelle de valeur un CompanyName champ dans un DataRow:The following example shows how to use a DataRowVersion value to get the current value of a CompanyName field in a DataRow:

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();
    
    Dim currentCompanyName = NorthwindDataSet1.Customers(0)(
        "CompanyName", DataRowVersion.Current).ToString()
    

Voir aussiSee also