IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ADO.NET Discussion :

SQL Compact Edition et requete imbriqué ?


Sujet :

ADO.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut SQL Compact Edition et requete imbriqué ?
    Bonjour,

    Est ce que Sql Compact Edition supporte les requete imbriqué ?

    J'ai une erreur sur mes requetes ou il y a des sous requete donc je me pose la question.

    L'erreur que je reçois :
    Une erreur s'est produite lors de l'analyse de la requête. [ Token line number = 1,Token line offset = 140,Token in error = SELECT ]
    Edit : ma requete fonctionne sous le SQL Management ou en utilisant SqlDataAdapteur et non SqlCeAdapteur.

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    À première vue il s'agit apparemment de la syntaxe de la requête qui est incorrecte. Peux-tu nous montrer ta requête ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    string req1 = "SELECT *, CASE WHEN type_transport = 'FRET' THEN 'T' ELSE 'ST' END AS unite, "+
                              " CASE WHEN p.solde = 1 THEN 'OUI' ELSE 'NON' END AS solde2, "+
                              " (SELECT designation + '\n' + adresse1 + '\n'+ adresse2 + '\n' + code_postal "+ 
                              " +' '+ ville +'\n'+ pays +'\n horaires : '+ horaires "+
                              " FROM str_adresses a3, str_clients c3 "+
                              " WHERE c3.id_adresse=a3.id_adresse AND a3.id_adresse=omd.id_expediteur) as expediteur, "+
                              " (SELECT designation + '\n' + adresse1 + '\n'+ adresse2 + '\n' + code_postal +' '+ ville "+
                              " +'\n'+ pays +'\n horaires : '+ horaires FROM str_adresses a2, str_clients c2 "+
                              " WHERE c2.id_adresse=a2.id_adresse AND a2.id_adresse=omd.id_destinataire) as destinataire,"+
                              " omd.quantite as qte_mission, omd.charge AS charge_mission, CASE WHEN Pefc=1 "+
                              " THEN 'OUI' ELSE 'NON' END AS PilePefc FROM str_piles p, str_chantiers c,"+
                              " str_ordre_mission_details omd, str_ordre_mission om  WHERE  "+
                              " p.id_chantier=c.id_chantier AND p.id_pile=omd.id_pile AND om.id_ordre_mission=omd.id_ordre_mission "+
                              " AND om.solde=0 AND om.type_mission!='FRET' AND om.id_chauffeur = '" + ChauffeurID + "' "+
                              " ORDER BY numero_mission DESC";
    La requête n'est pas de moi, mais elle fonctionne sur un site, elle fonctionne sous Management studio, fonctionne lorsque je n'utilise pas Sql compact Edition que je prend Sql Serveur.

    J'arrive a remplir mon datagrid avec Sql Compact Edition pour des requete simple. d'ou mon interrogation sur les requete imbriqué.

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Avec une requête comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    string req1 = "SELECT *, CASE WHEN type_transport = 'FRET' THEN 'T' ELSE 'ST' END AS unite, "+
                              " CASE WHEN p.solde = 1 THEN 'OUI' ELSE 'NON' END AS solde2, "+
                              " (SELECT designation + '\n' + adresse1 + '\n'+ adresse2 + '\n' + code_postal "+ 
                              " +' '+ ville +'\n'+ pays +'\n horaires : '+ horaires "+
                              " FROM str_adresses a3, str_clients c3 "+
                              " WHERE c3.id_adresse=a3.id_adresse AND a3.id_adresse=omd.id_expediteur) as expediteur, "+
                              " (SELECT designation + '\n' + adresse1 + '\n'+ adresse2 + '\n' + code_postal +' '+ ville "+
                              " +'\n'+ pays +'\n horaires : '+ horaires FROM str_adresses a2, str_clients c2 "+
                              " WHERE c2.id_adresse=a2.id_adresse AND a2.id_adresse=omd.id_destinataire) as destinataire,"+
                              " omd.quantite as qte_mission, omd.charge AS charge_mission, CASE WHEN Pefc=1 "+
                              " THEN 'OUI' ELSE 'NON' END AS PilePefc FROM str_piles p, str_chantiers c,"+
                              " str_ordre_mission_details omd, str_ordre_mission om  WHERE  "+
                              " p.id_chantier=c.id_chantier AND p.id_pile=omd.id_pile AND om.id_ordre_mission=omd.id_ordre_mission "+
                              " AND om.solde=0 AND om.type_mission!='FRET' AND om.id_chauffeur = '" + ChauffeurID + "' "+
                              " ORDER BY numero_mission DESC";

    Ce ne sera pas facile à déboguer

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    J'avoue qu'elle est lourde. Moi je ne fais que reprendre l'existant du web pour le mettre en local en wpf. Mais bon si Il n'y a pas de soucis sur les requete imbriqué je vais regarder ailleur.

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Sinon pourquoi avoir mis \n ce caractère n'est connu par T-SQL donc peut-être ça l'origine de ton problème.

    As-tu testé en virant ces caractères ?

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    Non je n'ai pas essayé mais en effet c'est peut etre la solution, car j'ai vue des posts parlant que Sql Compact avait des soucis avec les caractères spéciaux et qu'il fallait mettre des antislash devant je crois. Mais je n'ai pas pensé a le faire sur les \n, je vais essayer de suite.

    Sinon j'ai vue un autre post sur le fait de rajouter des crochet ["nomduchamp"]. Mais ça ne change rien.

    Je test sans les /n

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    Non ben ça ne change rien.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    J'ai fais un test en supprimant les requetes imbriqués est cela fonctionne, donc je dirais que Sql Compact Edition ne les supporte pas quand meme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
                string req1 = " SELECT *, CASE WHEN type_transport = 'FRET' THEN 'T' ELSE 'ST' END AS unite, "+
                    " CASE WHEN p.solde = 1 THEN 'OUI' ELSE 'NON' END AS solde2, "+
                    " a3.designation, a3.adresse1, a3.adresse2, a3.code_postal, a3.ville, a3.pays , c3.horaires, " +                
                    "   omd.quantite as qte_mission, omd.charge AS charge_mission, "+ 
                  "   CASE WHEN Pefc=1 THEN 'OUI' ELSE 'NON' END AS PilePefc "+
                  "   FROM str_adresses a3, str_clients c3, str_piles p, str_chantiers c, str_ordre_mission_details omd, str_ordre_mission om " +
                  "   WHERE   c3.id_adresse=a3.id_adresse AND a3.id_adresse=omd.id_expediteur AND "+
                  "   p.id_chantier=c.id_chantier AND p.id_pile=omd.id_pile AND " +
                   "   om.id_ordre_mission=omd.id_ordre_mission "+
                  "   AND om.solde=0 AND om.type_mission!='FRET' AND "+
                  "   om.id_chauffeur = '4f02bcec-63cc-4fc3-9260-9210adb564dd' ORDER BY numero_mission DESC;";

    J'ai juste gardé, une "adresse" alors que je dois en récupèrer plusieurs.

    Ce que je pense tester, c'est faire mes requetes séparement et du remplir le DataSet avec le resultat des trois.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    Bon en faite ça ne fonctionne pas sous Sql Management, donc j'ai droit à l'erreur suivante :

    Erreur majeure*0x80040E14, erreur mineure*25501
    > SELECT *, CASE WHEN type_transport = 'FRET' THEN 'T' ELSE 'ST' END AS unite,
    CASE WHEN p.solde = 1 THEN 'OUI' ELSE 'NON' END AS solde2,
    (SELECT designation + '<br>' + adresse1 + '<br>'+ adresse2 + '<br>' + code_postal +' '+ ville
    +'<br>'+ pays +'<br>horaires : '+ horaires FROM str_adresses a3, str_clients c3
    WHERE c3.id_adresse=a3.id_adresse AND a3.id_adresse=omd.id_expediteur) as expediteur,

    (SELECT designation + '<br>' + adresse1 + '<br>'+ adresse2 + '<br>' + code_postal +' '+ ville
    +'<br>'+ pays +'<br>horaires : '+ horaires FROM str_adresses a2, str_clients c2
    WHERE c2.id_adresse=a2.id_adresse AND a2.id_adresse=omd.id_destinataire) as destinataire,

    omd.quantite as qte_mission, omd.charge AS charge_mission,
    CASE WHEN Pefc=1 THEN 'OUI' ELSE 'NON' END AS PilePefc
    FROM str_piles p, str_chantiers c, str_ordre_mission_details omd, str_ordre_mission om
    WHERE p.id_chantier=c.id_chantier AND p.id_pile=omd.id_pile AND om.id_ordre_mission=omd.id_ordre_mission
    AND om.solde=0 AND om.type_mission!='FRET' AND
    om.id_chauffeur = '4f02bcec-63cc-4fc3-9260-9210adb564dd' ORDER BY num

    Une erreur s'est produite lors de l'analyse de la requête. [ Token line number = 3,Token line offset = 3,Token in error = SELECT ]

  11. #11
    Invité
    Invité(e)
    Par défaut
    Peux-tu exécuter chacune de tes sous requêtes séparément et voir ce que cela donne ?

    De plus configures l'affichage des numéros de lignes dans SSMS pour te faciliter la tâche de débogage. Une fois cela fait va à la ligne indiquée par SSMS et débogue la ligne concernée ou plus rapide double-clique sur l'erreur renvoyée.

  12. #12
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    Si tu dois travailler sur ce projet a long terme,
    un seul conseil refactorise tout ca et remplace tes requestes pseudo-dynamique pas de vrai requetes.

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    Alors pour le debogage je ne sais pas trop comment ça se passe sous SQl Management Studio.

    Par contre en effet j'etais entrain de decortiquer la requete, resultat :

    Lorsque j'execute ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT designation + '<br>' + adresse1 + '<br>'+ adresse2 + '<br>' + code_postal +' '+ ville
     +'<br>'+ pays +'<br>horaires : '+ horaires
     FROM str_adresses a3, str_clients c3 
    WHERE c3.id_adresse=a3.id_adresse AND a3.id_adresse=omd.id_expediteur
    Il me fais l'erreur.

    Lorsque que je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT designation + '<br>' + adresse1 + '<br>'+ adresse2 + '<br>' + code_postal +' '+ ville
     +'<br>'+ pays +'<br>horaires : '+ horaires
    FROM str_adresses  inner join str_ordre_mission_details
         on str_adresses.id_adresse = str_ordre_mission_details.id_expediteur
                      inner join  str_clients 
    	 on str_adresses.id_adresse = str_clients.id_adresse
    La requête s'execute bien


    Et lorsque je rajoute l'alias comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ( SELECT designation + '<br>' + adresse1 + '<br>'+ adresse2 + '<br>' + code_postal +' '+ ville
     +'<br>'+ pays +'<br>horaires : '+ horaires
    FROM str_adresses  inner join str_ordre_mission_details
         on str_adresses.id_adresse = str_ordre_mission_details.id_expediteur
                      inner join  str_clients 
    	 on str_adresses.id_adresse = str_clients.id_adresse  ) as expediteur
    Il me fais une erreur sur AS.

    Donc pour le moment mes conclusions, SQL CE ne supporte pas les alias et ça m'embete un peu et il ne supporte pas les jointure avec "=" ce qui est bcp moins grave tant que ça passe avec inner join

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    Zeavan : Non c'est pas pour du long terme, je devais juste repassé une partie du site en local et faire une synchro de donnée. donc les deux projet etant en c#, le top etait juste de faire un copié collé en gros, ce qui fonctionne pour quasiement tout.

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 142
    Points : 74
    Points
    74
    Par défaut
    Bon, j'ai trouvé une solution j'ai décomposé la requête.
    Je cré un DataSet et je rajoute, mes colonnes à la main puis les remplies avec les resultats d'autres requêtes.
    C'est pas très bien expliqué et hors contexte surement complexe à comprendre, mais ça peu laisser des idées pour les prochains qui verront le post.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
         try
                {
                    // récupèration de la mission
                    SqlCeDataAdapter da = new SqlCeDataAdapter(req, SqlCon.ConnectionString);
                    DataSet ds1 = new DataSet("test");
                    da.Fill(ds1);
    
                    // création des colonnes "expéditeur" et "destinataire" dans le DataSet principale qui va remplir le datagrid"
                    ds1.Tables[0].Columns.Add("expediteur");
                    ds1.Tables[0].Columns.Add("destinataire");
    
                    // pour chaque mission récupèré on récupère l'expéditeur & le destinataire
                    foreach (DataRow rows in ds1.Tables[0].Rows)
                    {
                        // récupèration de l'expediteur  
                        string reqExpediteur = " SELECT (a1.designation + '\n' + a1.adresse1 + '\n'+ a1.adresse2 + '\n' + a1.code_postal " +
                                                " +' '+ a1.ville  +'\n'+ a1.pays +'\nhoraires : '+ cli1.horaires) as nom " +
                                                " FROM str_adresses a1, str_clients cli1, " +
                                                 " str_ordre_mission_details omd,  str_ordre_mission om " +
                                                " WHERE   " +
                                                " cli1.id_adresse = a1.id_adresse AND " +
                                                " a1.id_adresse = omd.id_expediteur and " +
                                                " om.id_ordre_mission = omd.id_ordre_mission AND " +
                                                " om.id_ordre_mission = '" + rows["id_ordre_mission"] + "' ";
    
                        string reqDestinataire = " SELECT (a1.designation + '\n' + a1.adresse1 + '\n'+ a1.adresse2 + '\n' + a1.code_postal " +
                                                " +' '+ a1.ville  +'\n'+ a1.pays +'\nhoraires : '+ cli1.horaires) as nom " +
                                                " FROM str_adresses a1, str_clients cli1, " +
                                                 " str_ordre_mission_details omd,  str_ordre_mission om " +
                                                " WHERE   " +
                                                " cli1.id_adresse = a1.id_adresse AND " +
                                                " a1.id_adresse = omd.id_destinataire and " +
                                                " om.id_ordre_mission = omd.id_ordre_mission AND " +
                                                " om.id_ordre_mission = '" + rows["id_ordre_mission"] + "' ";
    
                        // Création et remplissage des DataSet "expéditeur" et "destinataire"
                        SqlCeDataAdapter daExpediteur = new SqlCeDataAdapter(reqExpediteur, SqlCon.ConnectionString);
                        DataSet dsExpediteur = new DataSet("test");
                        daExpediteur.Fill(dsExpediteur);
    
                        SqlCeDataAdapter daDestinataire = new SqlCeDataAdapter(reqDestinataire, SqlCon.ConnectionString);
                        DataSet dsDestinataire = new DataSet("test");
                        daDestinataire.Fill(dsDestinataire);
    
                        // assignation du résultat de la requête dans la colonne expéditeur
                        rows["expediteur"] = dsExpediteur.Tables[0].Rows[0]["nom"];
                        rows["destinataire"] = dsDestinataire.Tables[0].Rows[0]["nom"];
    
                        // Libération de mémoire
                        daExpediteur.Dispose();
                        dsExpediteur.Dispose();
                        daDestinataire.Dispose();
                        dsDestinataire.Dispose();
                    }
                    // ajout du dataSource au datagrid
                    dataGrid1.DataContext = ds1.Tables[0].DefaultView;
                    // Libérationd e mémoire des DataSet et Adapteur
                    da.Dispose();
                    ds1.Dispose();
    
                }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL Compact Edition 3.5] - compatibilité Seven et WIndow CE
    Par spezet29 dans le forum Développement
    Réponses: 1
    Dernier message: 05/06/2013, 12h47
  2. SQL Compact Edition & datetime avec les secondes
    Par slacky dans le forum Développement
    Réponses: 4
    Dernier message: 15/09/2011, 14h49
  3. Réponses: 3
    Dernier message: 18/08/2011, 14h32
  4. [Requête SQL]requete imbrique appelant même table
    Par moicats dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/03/2007, 16h36
  5. requete imbriquée SQL
    Par stoonman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/01/2007, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo