Ajout de contraintes à une table

Vous pouvez utiliser des contraintes pour appliquer des restrictions sur les données dans un DataTable, afin de conserver l'intégrité des données. 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. Les contraintes sont appliquées lorsque la propriété EnforceConstraints de DataSet a la valeur true.

Il existe deux types de contraintes dans ADO.NET : ForeignKeyConstraint et UniqueConstraint. Par défaut, ces deux contraintes sont automatiquement créées lorsque vous créez une relation entre plusieurs tables en ajoutant un DataRelation au DataSet. Toutefois, vous pouvez désactiver ce comportement en spécifiant createConstraints = false lors de la création de la relation.

ForeignKeyConstraint

ForeignKeyConstraint applique des règles sur la manière dont les mises à jour et les suppressions dans les tables connexes sont propagées. Par exemple, si une valeur d'une ligne d'une table est mise à jour ou supprimée et si cette valeur est également utilisée dans une ou plusieurs autres tables connexes, un ForeignKeyConstraint déterminera l'action à réaliser dans les tables connexes.

Les propriétés DeleteRule et UpdateRule de ForeignKeyConstraint définissent l'action à entreprendre lorsque l'utilisateur tente de supprimer ou de mettre à jour une ligne dans une table connexe. Le tableau suivant décrit les différents paramètres disponibles pour les propriétés DeleteRule et UpdateRule de ForeignKeyConstraint.

Règle Description
Cascade Supprime ou met à jour les lignes connexes. Il s'agit de la règle par défaut.
SetNull Définit les valeurs des lignes connexes sur DBNull.
SetDefault Définit les valeurs des lignes connexes sur la valeur par défaut.
None Spécifie qu'aucune action n'est réalisée dans les lignes connexes.

Un ForeignKeyConstraint peut limiter et propager les modifications dans les colonnes en relation. En fonction des propriétés définies pour le ForeignKeyConstraint d'une colonne et selon que la valeur true est attribuée ou non à la propriété EnforceConstraints du DataSet, certaines opérations réalisées dans la ligne parente peuvent provoquer une exception. Par exemple, si la propriété DeleteRule du ForeignKeyConstraint a la valeur None, il est impossible de supprimer une ligne parente possédant des lignes enfants.

Vous pouvez créer une contrainte de clé étrangère entre des colonnes uniques ou entre un tableau de colonnes en utilisant le constructeur ForeignKeyConstraint. Passez l'objet ForeignKeyConstraint résultant à la méthode Add de la propriété Constraints de la table, qui est un ConstraintCollection. Vous pouvez également passer des arguments de constructeur à plusieurs surcharges de la méthode Add d'un ConstraintCollection pour créer un ForeignKeyConstraint.

Lors de la création d'un ForeignKeyConstraint, vous pouvez passer les valeurs de DeleteRule et UpdateRule comme arguments au constructeur ou les définir comme propriétés, comme dans l'exemple suivant (où UpdateRule conserve la valeur par défaut, Cascade).

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)
[C#]
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);

AcceptRejectRule

Les modifications de lignes peuvent être acceptées à l'aide de la méthode AcceptChanges ou annulées à l'aide de la méthode RejectChanges du DataSet, DataTable ou DataRow. Lorsqu'un DataSet contient ForeignKeyConstraints, l'appel aux méthodes AcceptChanges ou RejectChanges entraîne l'application de AcceptRejectRule. La propriété AcceptRejectRule du ForeignKeyConstraint détermine l'action à réaliser dans les lignes enfants lors de l'appel à AcceptChanges ou RejectChanges dans la ligne parente.

Le tableau suivant énumère les valeurs pouvant être attribuées à AcceptRejectRule.

Action Description
Cascade Accepte ou rejette les modifications des lignes enfants.
None Spécifie qu'aucune action n'est réalisée dans les lignes enfants. Il s'agit de la valeur par défaut.

UniqueConstraint

L'objet UniqueConstraint, qui peut être assigné soit à une seule colonne, soit à un tableau de colonnes d'un DataTable, garantit que toutes les données des colonnes spécifiées sont uniques dans une ligne. Vous pouvez créer une contrainte unique pour une colonne ou un tableau de colonnes à l'aide du constructeur UniqueConstraint. Passez l'objet UniqueConstraint résultant à la méthode Add de la propriété Constraints de la table, qui est un ConstraintCollection. Vous pouvez également passer des arguments de constructeur à plusieurs surcharges de la méthode Add d'un ConstraintCollection pour créer un UniqueConstraint. Lors de la création d'un UniqueConstraint pour une ou plusieurs colonnes, vous pouvez spécifier si les colonnes correspondent à des clés primaires.

Vous pouvez également créer une contrainte unique pour une colonne en attribuant la valeur true à la propriété Unique de la colonne. L'affectation de la valeur false à la propriété Unique d'une colonne unique supprime toute contrainte existante. 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. Si vous supprimez une colonne de la propriété PrimaryKey d'un DataTable, UniqueConstraint est supprimé.

L'exemple suivant créé un UniqueConstraint pour deux colonnes d'un DataTable.

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

Voir aussi

Création et utilisation de DataSets | DataRelation, classe | DataTable, classe | ForeignKeyConstraint, classe | UniqueConstraint, classe