Question

J'utilise VS2008 C # Express et la base de données Northwind sur une application Windows Form.

J'ai utilisé le glisser-déposer pour configurer la liaison des détails principaux (j'ai utilisé les commandes et les détails de la commande) pour les deux vues de grille de données. À ce stade, tout fonctionne comme prévu. Afin de ne pas renvoyer chaque ligne de la table, je souhaite filtrer la table Commandes en fonction d'un filtre pour la table Commandes ET également d'un champ de la table Détails commandes. Dans l'assistant de configuration de TableAdapter, j'ai utilisé le générateur de requête pour ajouter un nouveau FillByMyFilter qui a créé la requête suivante:

SÉLECTIONNER Commandes. [ID de commande], Commandes. [ID client], Commandes. [ID d'employé], Commandes. [Nom du navire], Commandes. [Adresse de livraison], Commandes. [Ville d'expédition], Commandes. [Expédier Région],                       Commandes. [Code postal du navire], Commandes. [Pays du navire], Commandes. [Expédier par], Commandes. [Date commande], Commandes. [Date requise], Commandes. [Date d'expédition],                       Commandes.Frais DE COMMANDES INNER JOIN                       [Détails de la commande] ON Commandes. [ID de commande] = [Détails de la commande]. [ID de commande] WHERE (Commandes. [Nom du navire] LIKE N'A% ') ET ([Détails de la commande] .Quantity & Lt; 20)

Je l'ai obtenu en ajoutant les deux tables, mais je n'ai coché aucune des zones de champ dans la table Détails de la commande pour qu'il ne renvoie que les colonnes utilisées dans la requête de remplissage d'origine. J'essaie seulement de filtrer le DataSet dans la table principale à ce stade et de ne pas renvoyer un nombre différent de colonnes. Les lignes enfants des détails de la commande doivent quand même fonctionner comme le jeu de résultats non filtré par défaut.

Maintenant, le problème: lorsque je clique sur le bouton Exécuter la requête, cela fonctionne bien. Je reçois 53 lignes de la requête ci-dessus plutôt que 1078 en utilisant le remplissage par défaut créé par le concepteur. Il retourne les mêmes colonnes que la requête de remplissage d'origine. Cependant, lorsque j'essaie d'exécuter l'application, l'erreur de contrainte suivante s'affiche:

& "; Impossible d'activer les contraintes. Une ou plusieurs lignes contiennent des valeurs ne respectant pas les contraintes non nulles, uniques ou de clés étrangères. & Quot;

Qu'est-ce que je fais de travers?

UPDATE: Je pense que l'erreur de contrainte survient à cause de la jointure INNER créée par l'assistant. Si je modifie la requête pour qu'elle utilise LEFT JOIN, l'Assistant la redéfinit en INNER JOIN.

Ma question concerne toujours le filtrage des enregistrements de la table parent (commandes) en fonction de critères des tables parent et enfant. Mon prochain test consiste à essayer d'utiliser un proc stocké, mais j'aimerais savoir en utilisant uniquement la méthode FillBy personnalisée de TableAdapter.

Cordialement,

DeBug

Était-ce utile?

La solution 3

Merci à tous ceux qui ont posté une réponse. Voici comment je l'ai fait à l'aide de l'Assistant TableAdapter et du jeu de données typé Northwind.

1) Cliquez avec le bouton droit sur la table Parent dans le concepteur xsd pour ajouter ou configurer la requête. 2) Cliquez sur le & Quot; Suivant & Quot; bouton de l’Assistant jusqu’à ce que vous voyiez le " Générateur de requêtes " bouton. Cliquez sur le bouton Générateur de requêtes pour vous mettre en mode générateur de requêtes. 3) Cliquez avec le bouton droit de la souris et ajoutez la table enfant dans le volet de conception. Vous devriez avoir les deux tables et la contrainte par défaut qui les relie. 4) Cliquez sur la colonne de la table enfant que vous souhaitez filtrer (cette coche sera supprimée ultérieurement) afin de l'ajouter au volet des critères afin de pouvoir la filtrer. 5) Ajoutez le filtre pour les colonnes Parent et Child. Dans cet exemple, j'ai filtré le nom du navire LIKE 'A%' et la quantité commandée & Lt; 20.

Notez qu’à ce stade, vous pouvez tester votre requête en cliquant sur le bouton Exécuter la requête. À l'aide de l'édition compacte de base de données Northwind pour SQL 2008, 53 lignes sont renvoyées. Si vous deviez le sauvegarder à ce stade, il échouerait au moment de l'exécution à cause des clés primaires en double dans le jeu de résultats. Donc, les prochaines étapes vont se débarrasser d’eux.

6) Dans le volet de critères, désélectionnez la colonne de la table enfant que vous avez ajoutée précédemment. Le filtre restera et la même colonne sera maintenant désélectionnée dans le volet de conception. Si vous exécutez la requête, vous aurez toujours 53 lignes, mais sans la colonne de la table enfant. 7) Cliquez avec le bouton droit de la souris sur le volet de conception et ajoutez le & Quot; Group By & Quot ;. À ce stade, lorsque vous exécutez cette requête, vous ne devez plus avoir de doublons dans l'ID de commande. J'ai reçu exactement 29 lignes. 8) Cliquez sur OK puis sur le & Quot; Suivant & Quot; jusqu'à ce que vous sauvegardiez votre nouvelle requête FillBy. 9) Modifiez votre code source pour utiliser votre nouveau FillBy.

Lorsque j'ai exécuté l'application, j'ai obtenu la table filtrée Parent avec les mêmes 29 lignes que le bouton Exécuter la requête. La table enfant a fonctionné comme prévu et contenait au moins une ligne enfant contenant une quantité de & Lt; 20.

Pour une application du monde réel, je pense qu'il serait préférable d'utiliser un proc ou un LINQ stocké. Mais ce problème me faisait me gratter la tête et donc & "Je l’ai adapté" & "; juste parce que c'était un défi (au moins pour moi).

Autres conseils

Cet article contient des suggestions de dépannage visant à identifier la ligne à l'origine du problème:

enfer DataSet - & "Impossible d'activer les contraintes. Une ou plusieurs lignes contiennent des valeurs .... & Quot;

Si vous regardez dans Orders.Designer.cs (en devinant, car je travaille en VB), vous verrez probablement une contrainte unique définie sur Orders (pour la clé primaire).

Je suppose que le problème est que, lorsque vous exécutez votre requête, vous recevez un ou plusieurs ordres individuels qui ont > 1 OrderDetails.Quanity & Gt; 20 .... donc, cet ordre sera retourné deux fois dans votre jeu de résultats, enfreignant la clé primaire.

Essayez: SELECT * parmi les commandes où [Nom du navire] LIKE '% quel que soit% AND ID de commande entré (sélectionnez OrderID dans OrderDetails où Quantity & Lt; 20)

C’est probablement une façon très inefficace de le faire. Dans Oracle, vous utiliseriez EXISTS () au lieu de IN () mais je ne connais pas l’équivalent serveur SQL.

J'espère que vous avez obtenu cette réponse, mais si ce n’est pas le cas, réfléchissez-y.

Dans votre jeu de données, si les DataTables Order et OrderDetail DataTable ont une relation, cela fonctionne un peu comme une contrainte FK. Ainsi, il ne peut y avoir aucun enregistrement dans la table enfant (OrderDetail) qui ne possède pas d'enregistrement parent (Order) correspondant. Il se peut donc que lorsque vous actualisez le Order DataTable, avec la requête mentionnée ci-dessus, il reste des lignes enfants dans la table OrderDetail qui renverront aux enregistrements parent (Order) qui ne seront plus là après l'actualisation. Cela dit, si vous actualisez le Order DataTable, vous devez également actualiser la table de données OrderDetail ou supprimer la relation entre les deux DataTables.

J'espère que cela vous aidera ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top