février
2008
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
6 Commentaires + Ajouter un commentaire
Déménagement
Next Microsoft CEO
Articles récents
- Changement d’adresse de ce blog
- Article : les nouveautés de C# 5.0
- Modèle Entity Framework généré avec SQL Server 2008 et utilisé sous SQL Server 2005
- Les photos, vidéos et cadeaux des TechDays 2011
- La première journée en ligne sur TechDays TV
- Suivez les TechDays 2011 comme si vous y étiez sur la chaîne TechDays TV
- Téléchargez le programme des conférence des TechDays 2011
- Dernier jour des TechDays = plus de chance de remporter des cadeaux sur le stand de dvp !
- Venez à notre rencontre lors des TechDays 2011
- Les flux à ne pas rater lors des TechDays 2011
- Les TechDays 2011 s’invite sur votre smartphone Windows Phone 7
- Exclu des cadeaux du concours Developpez.com lors des TechDays 2011
- Ouverture de la galerie d’images sur notre site des TechDays
- Partagez votre expérience des Microsoft TechDays
- Grand concours Microsoft “FAN des TechDays 2011” : épisode 2 !
- Mettez-vous aux couleurs des TechDays 2011 !
- Developpez.com aux TechDays 2011
- Le Challenge Azure 2010 est fini !
- Suivez la keynote de la pdc10 en direct sur internet à 18h !
- MVP Visual C# 2010 – 2011 !!!
Vraiment super utile cette méthode, le temps gagné peut être énorme.
Merci !
Merci pour cette astuce. Même l’exemple utilisé m’a indiqué où était la mienne.
Celui ci :
Me.Validate() <br />
Me.TbparametresBindingSource.EndEdit() <br />
Me.TbparametresTableAdapter.Update(Me.GdocDataSet.tbparametres) <br />
MsgBox("la mise à jour à réussit") <br />
Catch ex As Exception <br />
MsgBox("la mise à jour a échoué") <br />
<br />
End Try <br />
ElseIf DataDataGridView.Visible = True Then
L’erreur à l’air d’etre génerer dans le Update du tableAdpater
Qu’as tu essayé d’exécuter comme code ?
Enfin de compte , sa me dit rien d’autre :
Une exception de première chance de type ‘System.Data.ConstraintException’ s’est produite dans System.Data.dll
Merci , cela veut dire que c’est du au fait que on entre un valeur trop grande ?