Contraintes de DataTableDataTable Constraints

Vous pouvez utiliser des contraintes pour appliquer des restrictions sur les données dans un objet DataTable afin de conserver l'intégrité des données.You can use constraints to enforce restrictions on the data in a DataTable, in order to maintain the integrity of the data. Une contrainte est une règle automatique, appliquée à une ou plusieurs colonnes en relation, qui détermine l'action à réaliser lorsque la valeur d'une ligne est modifiée.A constraint is an automatic rule, applied to a column or related columns, that determines the course of action when the value of a row is somehow altered. Les contraintes sont appliquées lorsque la System.Data.DataSet.EnforceConstraints propriété DataSet de a la valeur true.Constraints are enforced when the System.Data.DataSet.EnforceConstraints property of the DataSet is true. Pour obtenir un exemple de code montrant comment définir la propriété EnforceConstraints, consultez la rubrique de référence EnforceConstraints.For a code example that shows how to set the EnforceConstraints property, see the EnforceConstraints reference topic.

Il y a deux types de contraintes dans ADO.NET : la ForeignKeyConstraint et la UniqueConstraint.There are two kinds of constraints in ADO.NET: the ForeignKeyConstraint and the UniqueConstraint. Par défaut, les deux contraintes sont créées automatiquement lorsque vous créez une relation entre deux tables ou plus en ajoutant DataRelation un au DataSet.By default, both constraints are created automatically when you create a relationship between two or more tables by adding a DataRelation to the DataSet. Toutefois, vous pouvez désactiver ce comportement en spécifiant createConstraints = false lors de la création de la relation.However, you can disable this behavior by specifying createConstraints = false when creating the relation.

ForeignKeyConstraintForeignKeyConstraint

Un ForeignKeyConstraint applique des règles sur la façon dont les mises à jour et les suppressions des tables associées sont propagées.A ForeignKeyConstraint enforces rules about how updates and deletes to related tables are propagated. Par exemple, si une valeur dans une ligne d’une table est mise à jour ou supprimée et que cette même valeur est également utilisée dans une ou plusieurs tables associées, un ForeignKeyConstraint détermine ce qui se passe dans les tables associées.For example, if a value in a row of one table is updated or deleted, and that same value is also used in one or more related tables, a ForeignKeyConstraint determines what happens in the related tables.

Les DeleteRule propriétés UpdateRule et du ForeignKeyConstraint définissent l’action à entreprendre lorsque l’utilisateur tente de supprimer ou de mettre à jour une ligne dans une table associée.The DeleteRule and UpdateRule properties of the ForeignKeyConstraint define the action to be taken when the user attempts to delete or update a row in a related table. Le tableau suivant décrit les différents paramètres disponibles pour les propriétés DeleteRule et UpdateRule de ForeignKeyConstraint.The following table describes the different settings available for the DeleteRule and UpdateRule properties of the ForeignKeyConstraint.

Paramètre de règleRule setting DescriptionDescription
CascadeCascade Supprime ou met à jour les lignes connexes.Delete or update related rows.
SetNullSetNull Définissez les valeurs des lignes connexes sur DBNull.Set values in related rows to DBNull.
SetDefaultSetDefault Définit les valeurs des lignes connexes sur la valeur par défaut.Set values in related rows to the default value.
AucunNone N'effectue aucune action sur les lignes connexes.Take no action on related rows. Il s'agit de la valeur par défaut.This is the default.

Un ForeignKeyConstraint peut restreindre, ainsi que propager, les modifications apportées aux colonnes associées.A ForeignKeyConstraint can restrict, as well as propagate, changes to related columns. En fonction des propriétés définies pour le ForeignKeyConstraint d’une colonne, si la propriété EnforceConstraints du jeu de données a la valeur true, l’exécution de certaines opérations sur la ligne parente entraîne une exception.Depending on the properties set for the ForeignKeyConstraint of a column, if the EnforceConstraints property of the DataSet is true, performing certain operations on the parent row will result in an exception. Par exemple, si la propriété DeleteRule de ForeignKeyConstraint a la valeur None, une ligne parente ne peut pas être supprimée si elle contient des lignes enfants.For example, if the DeleteRule property of the ForeignKeyConstraint is None, a parent row cannot be deleted if it has any child rows.

Vous pouvez créer une contrainte de clé étrangère entre des colonnes uniques ou entre un tableau de colonnes à l’aide du constructeur ForeignKeyConstraint .You can create a foreign key constraint between single columns or between an array of columns by using the ForeignKeyConstraint constructor. Transmettez l’objet ForeignKeyConstraint résultant à la méthode Add de la propriété Constraints de la table, qui est un ConstraintCollection.Pass the resulting ForeignKeyConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Vous pouvez également passer des arguments de constructeur à plusieurs surcharges de la méthode Add d’un ConstraintCollection pour créer un ForeignKeyConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a ForeignKeyConstraint.

Lors de la création d’un ForeignKeyConstraint, vous pouvez passer les valeurs de DeleteRule et UpdateRule comme arguments au constructeur, ou vous pouvez les définir comme des propriétés comme dans l’exemple suivant (où la valeur DeleteRule est définie sur Aucun).When creating a ForeignKeyConstraint, you can pass the DeleteRule and UpdateRule values to the constructor as arguments, or you can set them as properties as in the following example (where the DeleteRule value is set to None).

Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _  
  custDS.Tables("CustTable").Columns("CustomerID"), _  
  custDS.Tables("OrdersTable").Columns("CustomerID"))  
custOrderFK.DeleteRule = Rule.None    
' Cannot delete a customer value that has associated existing orders.  
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)  
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",  
  custDS.Tables["CustTable"].Columns["CustomerID"],   
  custDS.Tables["OrdersTable"].Columns["CustomerID"]);  
custOrderFK.DeleteRule = Rule.None;    
// Cannot delete a customer value that has associated existing orders.  
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);  

AcceptRejectRuleAcceptRejectRule

Les modifications apportées aux lignes peuvent être acceptées à l’aide de la méthode AcceptChanges ou annulées à l’aide de la méthode RejectChanges du DataSet, du DataTableou de DataRow.Changes to rows can be accepted using the AcceptChanges method or canceled using the RejectChanges method of the DataSet, DataTable, or DataRow. Lorsqu’un jeu de données contient des ForeignKeyConstraints, l’appel des méthodes AcceptChanges ou RejectChanges applique la méthode AcceptRejectRule.When a DataSet contains ForeignKeyConstraints, invoking the AcceptChanges or RejectChanges methods enforces the AcceptRejectRule. La propriété AcceptRejectRule de ForeignKeyConstraint détermine l’action qui sera entreprise sur les lignes enfants lorsque AcceptChanges ou RejectChanges est appelé sur la ligne parente.The AcceptRejectRule property of the ForeignKeyConstraint determines which action will be taken on the child rows when AcceptChanges or RejectChanges is called on the parent row.

Le tableau suivant répertorie les paramètres disponibles pour AcceptRejectRule.The following table lists the available settings for the AcceptRejectRule.

Paramètre de règleRule setting DescriptionDescription
CascadeCascade Accepte ou rejette les modifications des lignes enfants.Accept or reject changes to child rows.
AucunNone N'effectue aucune action sur les lignes enfants.Take no action on child rows. Il s'agit de la valeur par défaut.This is the default.

ExempleExample

L'exemple suivant crée un objet ForeignKeyConstraint, définit plusieurs de ses propriétés, notamment la AcceptRejectRule, et l'ajoute à la ConstraintCollection d'un objet DataTable.The following example creates a ForeignKeyConstraint, sets several of its properties, including the AcceptRejectRule, and adds it to the ConstraintCollection of a DataTable object.

private void CreateConstraint(DataSet dataSet, 
    string table1, string table2,string column1, string column2)
{
   // Declare parent column and child column variables.
   DataColumn parentColumn;
   DataColumn childColumn;
   ForeignKeyConstraint foreignKeyConstraint;

   // Set parent and child column variables.
   parentColumn = dataSet.Tables[table1].Columns[column1];
   childColumn = dataSet.Tables[table2].Columns[column2];
   foreignKeyConstraint = new ForeignKeyConstraint
      ("SupplierForeignKeyConstraint",  parentColumn, childColumn);

   // Set null values when a value is deleted.
   foreignKeyConstraint.DeleteRule = Rule.SetNull;
   foreignKeyConstraint.UpdateRule = Rule.Cascade;
   foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None;

   // Add the constraint, and set EnforceConstraints to true.
   dataSet.Tables[table1].Constraints.Add(foreignKeyConstraint);
   dataSet.EnforceConstraints = true;
}
Private Sub CreateConstraint(dataSet As DataSet, _
   table1 As String, table2 As String, _
   column1 As String, column2 As String)

   ' Declare parent column and child column variables.
   Dim parentColumn As DataColumn
   Dim childColumn As DataColumn
   Dim foreignKeyConstraint As ForeignKeyConstraint

   ' Set parent and child column variables.
   parentColumn = dataSet.Tables(table1).Columns(column1)
   childColumn = dataSet.Tables(table2).Columns(column2)
   foreignKeyConstraint = New ForeignKeyConstraint _
      ("SupplierForeignKeyConstraint", parentColumn, childColumn)

   ' Set null values when a value is deleted.
   foreignKeyConstraint.DeleteRule = Rule.SetNull
   foreignKeyConstraint.UpdateRule = Rule.Cascade
   foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None

   ' Add the constraint, and set EnforceConstraints to true.
   dataSet.Tables(table1).Constraints.Add(foreignKeyConstraint)
   dataSet.EnforceConstraints = True
End Sub

UniqueConstraintUniqueConstraint

L’objet UniqueConstraint , qui peut être assigné à une colonne unique ou à un tableau de colonnes dans un DataTable, garantit que toutes les données de la colonne ou des colonnes spécifiées sont uniques par ligne.The UniqueConstraint object, which can be assigned either to a single column or to an array of columns in a DataTable, ensures that all data in the specified column or columns is unique per row. Vous pouvez créer une contrainte unique pour une colonne ou un tableau de colonnes à l’aide du constructeur UniqueConstraint .You can create a unique constraint for a column or array of columns by using the UniqueConstraint constructor. Transmettez l’objet UniqueConstraint résultant à la méthode Add de la propriété Constraints de la table, qui est un ConstraintCollection.Pass the resulting UniqueConstraint object to the Add method of the table's Constraints property, which is a ConstraintCollection. Vous pouvez également passer des arguments de constructeur à plusieurs surcharges de la méthode Add d’un ConstraintCollection pour créer un UniqueConstraint.You can also pass constructor arguments to several overloads of the Add method of a ConstraintCollection to create a UniqueConstraint. Lorsque vous créez un UniqueConstraint pour une ou plusieurs colonnes, vous pouvez éventuellement spécifier si la ou les colonnes sont une clé primaire.When creating a UniqueConstraint for a column or columns, you can optionally specify whether the column or columns are a primary key.

Vous pouvez également créer une contrainte unique pour une colonne en attribuant la valeur trueà la propriété unique de la colonne.You can also create a unique constraint for a column by setting the Unique property of the column to true. Sinon, l’affectation de la valeur false à la propriété unique d’une seule colonne supprime toute contrainte unique qui peut exister.Alternatively, setting the Unique property of a single column to false removes any unique constraint that may exist. Lorsque vous définissez une ou plusieurs colonnes comme clé primaire d'une table, une contrainte unique est automatiquement créée pour les colonnes spécifiées.Defining a column or columns as the primary key for a table will automatically create a unique constraint for the specified column or columns. Si vous supprimez une colonne de la propriété PrimaryKey d’un DataTable, UniqueConstraint est supprimé.If you remove a column from the PrimaryKey property of a DataTable, the UniqueConstraint is removed.

L’exemple suivant crée un UniqueConstraint pour deux colonnes d’un DataTable.The following example creates a UniqueConstraint for two columns of a DataTable.

Dim custTable As DataTable = custDS.Tables("Customers")  
Dim custUnique As UniqueConstraint = _  
    New UniqueConstraint(New DataColumn()   {custTable.Columns("CustomerID"), _  
    custTable.Columns("CompanyName")})  
custDS.Tables("Customers").Constraints.Add(custUnique)  
DataTable custTable = custDS.Tables["Customers"];  
UniqueConstraint custUnique = new UniqueConstraint(new DataColumn[]   
    {custTable.Columns["CustomerID"],   
    custTable.Columns["CompanyName"]});  
custDS.Tables["Customers"].Constraints.Add(custUnique);  

Voir aussiSee also