[ADO.NET] Requete sur dataset avec subquery

Requete sur dataset avec subquery [ADO.NET] - SQL/NoSQL - Programmation

Marsh Posté le 18-10-2007 à 01:36:47    


 
Bonjour,
 
J'essaye de faire une requête assez simple sur mon dataset avec une subquery..
La requete est lancé via le .select d'une datatable, et la subquery est un select sur une autre datatable du dataset.
Ca ressemble à ça (j'ai coupé les declarations etc..) :
 
 
--------------------------------------------------------------------------------
 
dtrT_requete  =  datatable1.select("(Genre = 2) AND (PersonneId  NOT IN (SELECT ElementId FROM datable2 WHERE (Type = 2) ))" )
 
 
--------------------------------------------------------------------------------
 
Mais j'ai un message d'erreur "générique".  
Est-ce possible que les subquery ne soient pas possible dans ce genre de requêtes ??  
 
Si je fais :
 
dtrT_requete  =  datatable1.select("(Genre = 2) AND (PersonneId  NOT IN (39,40 ))" )
 
Cela fontionne très bien.. Toutes mes lignes avec Genre = 2 et dont PersonneId <> de 39 ou 40 sont retournées.
La sous requete : SELECT ElementId FROM datable2 WHERE (Type = 2)    elle retourne elle bien 39, 40 !
J'ai testé dans le query designer de visual studio et sur la même base de donnée (access).
 
 
 
Quelqu'un aurait une solution ?
Faut-il faire la sous requete d'abords, convertir ça dans une variable pour utiliser le NOT IN  ??    
 
Merci d'avance!

Reply

Marsh Posté le 18-10-2007 à 01:36:47   

Reply

Marsh Posté le 25-10-2007 à 21:36:09    

:)

Reply

Marsh Posté le 26-10-2007 à 11:22:48    

je pense effectivement que tu ne peux pas écrire de sous-requête dans un "select" d'un dataset. tu dois trouver une autre solution pour filtrer, genre récupérer la liste des personne id à la main

Reply

Marsh Posté le 27-10-2007 à 01:42:25    

merci..
 
bon..
je vais faire la sous requete avant, la garder dans une array et re transformer cela en string :/
 

Reply

Marsh Posté le 28-10-2007 à 07:43:02    

sinon, j'ai un collègue au taff qui était amoureux des filtres dans les dataset (genre un bon gros select * sans clause where pour alimenter le DS, puis des bon gros filtres des familles dans le DS pour récupérer ce qu'il voulait). J'ai jamais vu trop l'intérêt du truc : ça ne me semple pas plus facile à écrire, absolument pas portable, ça empêche la séparation en couches de l'appli, etc.
 
bref, moi j'en ai jamais eu besoin, et je ne m'en suis jamais servit (faut dire que ça seule fois où j'ai essayé ça n'a pas marché, j'en garde pas un bon souvenir en plus :D).
 
enfin voilà. je te conseille d'essayer de faire sans. mise à part cas très spécifiques (et encore, j'ai beau chercher, je vois pas dans quels cas tu peux avoir besoin de "tout", puis la seconde d'après de "trois fois rien" ) je te conseille d'exécuter des requêtes SQL directement dans le SGBD à chaque fois. c'est au SGBD de faire ce travail, pas au poste client.

Reply

Marsh Posté le 29-10-2007 à 03:38:23    

A vrai dire, mon programme charge l'ensemble des données dans le dataset à l'ouverture : je travaille avec un fichier *.mdb et non un sql server, c'est donc bien facile de charger le fichier "onload" puis de le refermer.
 
Ensuite, je fais tout à partir du Dataset.. c'est plus rapide :)
 
Donc je suis un peu déçu des requetes SELECT proposées dans le dataset.. dommage car pour le moment j'ai été étonné des très nombreuses possibilitées du dataset!
 
Alors j'ai plusieurs choix : soit je créer la requête et l'envoi au fichier puis récupère le résultat, soit je fais de même avec un stored procedure, ou enfin je crée la sous requete avant.
Pour le moment j'ai essayé la sous requete avant le SELECT et ça marche bien.. je pense que je vais garder cela.
 
Pour les filtres, je ne l'ai encore jamais fais.. est-ce que tu pense que je peux mettre une requete dans le filtre ? (exemple dans le filtre mettre un autre .SELECT)
car si le filtre a besoin de données toute prêtes (exemple "<> 39, 40" ) dans ce cas ça ne m'avance pas je dois tout de même faire la sous requete en premier et le garder dans une array..
 
merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed