Auteur de questions
Mode déconnecté contraignant

Discussion générale
-
Bonjour, j'ai un soucis dans mon application en C# qui est codé en ADO Déconnecté.
J'ai donc plusieurs tables, et j'ai une requête qui m'affiche des informations de différente table. J'ai des entraîneurs de club qui peuvent être jury dans des compétitions.
J'ai donc créer une requête sur le tableAdapter qui permet de récupérer le nom, prénom des juges (correspondant a l'entité entraîneurs), leur club et leur numéro de jury relatif a une compétition dont l'ID est passé en paramètre.
Voici la requête :SELECT ENTRAINEUR.NOM_ENT, ENTRAINEUR.PRENOM_ENT, CLUB.LIBELLE_CLUB, jury.NUM_COMPETITION FROM JURY ,ENTRAINEUR, CLUB WHERE JURY.NUM_COMPETITION = @num AND JURY.ID_ENT = ENTRAINEUR.ID_ENT AND ENTRAINEUR.ID_CLUB = CLUB.ID_CLUB
Cette requête fonctionne parfaitement sur mon serveur SQL. (avec le paramètre 1)
http://nsa37.casimages.com/img/2016/02/22/160222044652344024.png
Quand je la lance depuis mon programme en lui passant le paramètre 1 j'ai une erreur ConstraintException
http://nsa37.casimages.com/img/2016/02/22/160222044900957016.png
Vous remarquez que j'ai passé EnforceConstraints à false et le this.idCompetition est bien égale a 1.
J'ai une erreur de contrainte la ou il n'y a pas de contrainte (je demande des nom/prénom/club et rang jury ...)
Je ne comprend pas.
Que faire ? j'ai pensé a passer par une requête linq (sur mon dataset local), mais j'aimerais vraiment traiter sa dans un tableAdapter (pour des raisons de coherence).
Merci de votre lecture.
Cordialement.- Type modifié Teodora SharkovaModerator samedi 9 avril 2016 12:49
Toutes les réponses
-
Bonjour, Shining34,
Veuillez consulter l'article en bas (partie Contraintes de mise à jour) :
Enregistrement de données dans des groupes de données
Je vous remercie par avance de votre retour.Cordialement,
TeodoraVotez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.
-
Bonjour. L'article propose de retirer les restrictions temporairement : Je cite mon message initial
Vous remarquez que j'ai passé EnforceConstraints à false
Ensuite, je ne cherche pas à Mettre à Jour, mais a Afficher seulement les données. Je récupère, j'affiche, je supprime (l'update est déjà géré dans un autre formulaire et il est fonctionnel).
Merci de votre réponse.
-
Bonjour,
Ca fait longtemps que je ne fais plus de DataAdapter donc je suis franchement rouillé. Mais il y a plusieurs choses qu'il faudrait vérifier :
- Que votre juryTableAdapter fait bien référence à karateDataset, car sinon votre EnforceConstraints ne s'appliquera pas à votre adapter.
- Le problème vient peut-être du fait que vous avez des contraintes de définies et que votre requête d'extraction retourne des valeurs qui violent ces contraintes. Ce qui expliquerait que vous ayez des erreurs alors que vous ne fait que lire.
- Assurez vous que juryTableAdater.GetJuryDataByCompetition() ne fait pas d'instruction de mise à jour ou de création avant de retourner le résultat.
- Regardez bien toutes les informations transmises par l'exception pour savoir quelle contrainte serait violée, ce qui pourrait vous donner une piste pour résoudre le problème.
Cordialement,
Yan Grenier
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles. -
Bonjour,
Ca fait longtemps que je ne fais plus de DataAdapter donc je suis franchement rouillé. Mais il y a plusieurs choses qu'il faudrait vérifier :
- Que votre juryTableAdapter fait bien référence à karateDataset, car sinon votre EnforceConstraints ne s'appliquera pas à votre adapter.
- Le problème vient peut-être du fait que vous avez des contraintes de définies et que votre requête d'extraction retourne des valeurs qui violent ces contraintes. Ce qui expliquerait que vous ayez des erreurs alors que vous ne fait que lire.
- Assurez vous que juryTableAdater.GetJuryDataByCompetition() ne fait pas d'instruction de mise à jour ou de création avant de retourner le résultat.
- Regardez bien toutes les informations transmises par l'exception pour savoir quelle contrainte serait violée, ce qui pourrait vous donner une piste pour résoudre le problème.
Cordialement,
Merci de votre réponse, je vais essayer d'y répondre point par point.
1er point : Mon tableAdapter fait référence a mon dataset, puisque je n'ai qu'un dataset dans l'application (je ne peux pas avoir un table adapter sans dataset non ? si j'ai qu'un dataset, le table adapter est forcement issue de lui ? je vais quand même regarder après avoir poster ce message car on ne sait jamais.
2eme point : Je vous redirige vers mon poste principal, la requête fonctionne parfaitement coté SQL Server Managment Client (screenshots fourni) mais pas coté application (avec le même paramètre qui est "1"). Si ce n'est pas une preuve, pourriez vous mieux me guidé sur ce point ? car je ne vois pas en quoi récupérer des données en lecture seulement pourrait être soumis au contrainte autre que la bonne jointure des différentes tables. Le problème de la jointure est écarté car comme précisé, la requête fonctionne sans soucis sur ma base directement. Je ne vois pas d'autre contrainte applicable, car mes triggers sont sur l'insertion (qui soit dit en passant fonctionne pour ajouter un jury, mais récupérer les jury et leurs nom et le label de leur club d'entrainement non).
Je pense vraiment que le fait que je recoupe des info de différentes tables sans avoir de clé étrangère (mes clés étrangère sont géré par des triggers, pas par des foreign key a proprement dit). Serais-ce une piste ?
3eme point : Non c'est sur. Je l'ai fait avec l'interface graphique de VS. Et j'ai bien sélectionné "Retourne plusieurs résultats dans un datable".
4eme point : L’exception est ConstraintException, et je ne vois pas d'ou sa peux venir car aucune donnée n'a été recuperé que l'exception est déjà levée. (http://nsa38.casimages.com/img/2016/02/22/160222053037224882.png)
Merci de votre réponse !
Cordialement.
-
2) Attention quand je parle des contraintes, se sont les contraintes définies dans le dataset. C'est indépendant de la base SQL.
C'est une des problématiques des datasets, si vous le générez depuis votre base de données, il va détecter toutes les clés étrangères avec les contraintes de nullité, etc. Il va les transformer en contraintes. Le dataset ensuite va appliquer ces contraintes "en mémoire". Donc lorsque vous chargez des données dans le dataset, lui il est bête et méchant on lui à dit qu'il y avait des contraintes il les applique. L'idée étant de valider les données avant de les transmettre au serveur.
Donc en effet si vous ne récupérez qu'un 'sous-ensemble' de données et que dans ces données il manque par exemple des références ou que vous ne retournez pas la totalité des données dont certaines ne doivent pas être null, les exceptions sur les contraintes seront levées.
C'est pour cela que j'indiquais mon point 1) car ca pourrait expliquer le fait que les contraintes sont tout de même appliquées malgré le EnforceContraints à false.
4) Il faut regarder également si vous avez des "InnerException" et remonter la chaîne et bien regarder toutes les propriétés des exceptions. Il me semble que normalement on devrait connaître la contrainte qui provoque l'erreur.
Mais bon comme ca fait longtemps que je n'utilise plus les datasets, je ne peux pas garantir que c'est jouable.
Cordialement,
Yan Grenier
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles. -
2) Attention quand je parle des contraintes, se sont les contraintes définies dans le dataset. C'est indépendant de la base SQL.
>>> En effet, puisque coté serveur la requete fonctionne, je pense aussi que le souci vient du dataset qui a les contraint en mémoire.
4) Il faut regarder également si vous avez des "InnerException" et remonter la chaîne et bien regarder toutes les propriétés des exceptions. Il me semble que normalement on devrait connaître la contrainte qui provoque l'erreur.>>> null, il n'y a rien.
C'est pour cela que j'indiquais mon point 1) car ca pourrait expliquer le fait que les contraintes sont tout de même appliquées malgré le EnforceContraints à false.
>>> J'entend votre argument, mais j'ai un tableAdapter qui depent forcement du dataset, et j'ai retiré les constraint avec la commande "karateDataSet.EnforceConstraints = false;" mais ceci ne fonctionne pas. Comment pourrais-je avoir accès au données autrement ? je crois que je vais cedé, je vais passé par une requête SQL et laisser tomber mon dataset, mais pour des raisons de cohérence j’aurais aimer resté en déconnecté de A à Z, j'ai aussi la possibilité de requêté avec link mon dataset peux être que je réussirais à le faire avec.Donc, peux on avoir en ADO déconnecte un table adapter qui ne depent d'aucun dataset ? Enfin, sa parait débile dit comme sa, plus je regarde la solution vers laquel je me penche, plus je pense que je vais faire une simple requête SQL mais qui ne sera pas associé au tableAdapter (car actuellement c'est une simple requête SQL MAIS qui est associé a un tableAdapter, donc dataset et constraint).
Je voulais vraiment rester en déconnecté de A à Z mais la je sèche, je ne peux pas totalement retirer les contraints, sinon le reste de l'application pourrait mal réagir, vu que la validation est fait coté client grâce au constraint contenu en mémoire dans la configuration du dataset...
Et en les retirant juste avant, cela ne fonctionne pas ...
Je ne vois pas d'autre piste.
Mais merci de vos propositions, vous êtes peut être plus au point sur les dataset, mais vous êtes le seul a me répondre des pistes intéressantes, donc merci beaucoup.
-
Désolé, je n'ai pas d'autres propositions à faire.
Les Datasets ont toujours été un peu difficiles à manipuler sur certains points. En plus du fait donné que le mode déconnecté n'est plus vraiment utilisé dans le développement moderne, c'est une des raisons pour laquelle cette librairie n'est plus supportée au profit des ORM (notamment Entity Framework pour Microsoft) qui permettent une plus grande latitude (selon les librairies).
Cordialement,
Yan Grenier
Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.