Si vous utilisez régulièrement les DataSet, vous reconnaîtrez sûrement le message suivant :

Impossible d’activer les contraintes. Une ou plusieurs lignes contiennent des valeurs qui violent les contraintes de type non null, unique ou de clé externe.

Ce message est lancé lorsqu’on remplit un DataSet avec des données qui ne respectent pas les contraintes définies sur le DataSet. Exemples :

  • Violation d’unicité,
  • Le type n’est pas le même,
  • La taille du champ n’est pas respecté,

Et pourtant quand on reçoit cette exception de type System.Data.ConstraintException, on a pas d’autre information dans cet objet pour déterminer la source du problème. Et c’est vrai que je n’ai jamais eu besoin de plus d’information tellement mes erreurs me sautaient aux yeux en regardant les données que j’essayais de charger dans mes DataSet. Cette façon de faire fonctionne très bien sur des petites tables mais quand on a des tables avec au minimum 20 champs, c’est plus délicat… Comment faire dans ce cas là ?

Les DataTable, composant votre DataSet, possèdent une méthode appelée GetErrors() qui permet tout simplement de récupérer un tableau de type DataRow. Cette liste représente chaque erreur de contrainte au sein du DataTable.

Comme exemple, j’ai créé une petite table « Clients » en base de données avec un champ « Nom » de type texte fixé à 20 caractères maximum.

Dans mon projet sous Visual Studio, j’ai créé un DataSet typé où j’y ai glissé cette fameuse table « Clients » afin d’en faire un DataTable et pour la beauté de la démo, j’ai fixé la longueur du champ « Nom » à 10 caractères au lieu de 20.

Ci-dessous, le code qui va charger les données de la base dans le DataSet :

Ce qui provoquera l’exception attendue avec comme résultat à l’écran :

La colonne ‘nom’ dépasse la limite MaxLength.
La colonne ‘nom’ dépasse la limite MaxLength.
La colonne ‘nom’ dépasse la limite MaxLength.
La colonne ‘nom’ dépasse la limite MaxLength.
La colonne ‘nom’ dépasse la limite MaxLength.

Bon développement en espérant vous avoir fait économisé quelques secondes de recherches :)