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

Windows Forms Discussion :

C# (ou Framework) n'aime pas ma requète SQL [Débutant]


Sujet :

Windows Forms

  1. #1
    Membre expert
    Avatar de Chauve souris
    Homme Profil pro
    amateur (éclairé ?)
    Inscrit en
    Novembre 2005
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Paraguay

    Informations professionnelles :
    Activité : amateur (éclairé ?)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 186
    Points : 3 086
    Points
    3 086
    Par défaut C# (ou Framework) n'aime pas ma requète SQL
    J'ai cherché longtemps avant de comprendre ce qui coinçait car c'était une erreur d'exécution.

    Voila le problème :

    J'ai, dans SQL Server 2012, une vue qui fonctionne sans souci. Je décide de prendre juste la partie SELECT... et l'intégrer dans une appli Windows Form. J'ai déjà fait ce type d'appli avec un programme exemple du Coach Microsoft. Mais dans mon cas ça coince et l'erreur se ramasse sur le nom du champ.

    D'abord voici ma requête SQL de ma vue SQL Server sans reproche

    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
     
    SELECT Auteurs.Nom, Auteurs.Prénom, Ouvrages.Titre, 
        Ouvrages.[Sous-titre], Catégories.[Nom de la catégorie], 
        Editeurs.Nom AS Editeur, Collections.[Titre de collection]
    FROM Catégories INNER JOIN
        Auteurs INNER JOIN
        Editeurs INNER JOIN
        Collections ON 
        Editeurs.éditeurID = Collections.éditeurID INNER JOIN
        Ouvrages ON Editeurs.éditeurID = Ouvrages.éditeurID AND 
        Collections.collectionID = Ouvrages.collectionID ON 
        Auteurs.auteurID = Ouvrages.auteurID ON 
        Catégories.catégorieID = Ouvrages.catégorieID
    GROUP BY Auteurs.Nom, Auteurs.Prénom, Ouvrages.Titre, 
        Ouvrages.[Sous-titre], Catégories.[Nom de la catégorie], 
        Editeurs.Nom, Collections.[Titre de collection]
    Collée dans une variable string (en supprimant les retours à la ligne que C# n'aime pas, même si ça fait un code moche comme tout) ça ne fonctionne pas et ExecuteReader se ramasse avec ce qu'il considère comme un dépassement de capacité sur le premier champ rencontré. Erreur pas évidente et j'ai séché longtemps. Mettre des crochets [Auteurs].[Nom] de résout rien. En fait c'est le nom de la table (Auteurs) qui précède qui ne va pas. Simplifiant ma requête à l'extrême aux fins de débogage ça ne fonctionnait pas mieux avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Auteurs.Prénom, Auteurs.Nom FROM Auteurs
    et parfaitement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Prénom, Nom FROM Auteurs
    Pourquoi donc ne pas pouvoir préfixer le nom du champ avec le nom de la table comme c'est une bonne habitude prise en SQL ? D'autant plus conseillé que lors d'un SELECT à rallonge avec des JOIN en pagaille le moteur SQL risque de grimacer sur des ambigüités.

    Question subsidiaire : Peut-on utiliser directement une vue dans un code Windows Form de la même façon qu'on utilise une procédure stockée (en l'appelant par son nom) ?

    Merci à tous de vous pencher sur mes petites misères.
    "Toute l'histoire de l'informatique n'a été que l'histoire des systèmes d'exploitations" (Le Manifeste du PC)

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Citation Envoyé par Chauve souris Voir le message
    Pourquoi donc ne pas pouvoir préfixer le nom du champ avec le nom de la table comme c'est une bonne habitude prise en SQL ? D'autant plus conseillé que lors d'un SELECT à rallonge avec des JOIN en pagaille le moteur SQL risque de grimacer sur des ambigüités.
    Parce que normalement, ce n'est pas avec le nom de la table que l'on préfixe les champs mais avec un alias.

    Je n'ai pas de sqlserver actif sous la main, mais je suis quand même un peu surpris que ça ne marche pas.

    Citation Envoyé par Chauve souris Voir le message
    Question subsidiaire : Peut-on utiliser directement une vue dans un code Windows Form de la même façon qu'on utilise une procédure stockée (en l'appelant par son nom) ?
    Oui, il suffit de la considérer comme une table (qui ne sera normalement qu'en lecture seule). Il te suffit donc de faire un SELECT * sur ta vue
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre expert
    Avatar de Chauve souris
    Homme Profil pro
    amateur (éclairé ?)
    Inscrit en
    Novembre 2005
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Paraguay

    Informations professionnelles :
    Activité : amateur (éclairé ?)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 186
    Points : 3 086
    Points
    3 086
    Par défaut
    Un alias ? Je vais expérimenter ça demain.
    "Toute l'histoire de l'informatique n'a été que l'histoire des systèmes d'exploitations" (Le Manifeste du PC)

  4. #4
    Membre expert
    Avatar de Chauve souris
    Homme Profil pro
    amateur (éclairé ?)
    Inscrit en
    Novembre 2005
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Paraguay

    Informations professionnelles :
    Activité : amateur (éclairé ?)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 186
    Points : 3 086
    Points
    3 086
    Par défaut Les alias fonctionnent !
    J'ai donc remplacé ma mini requête par celle.ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.Prénom, a.Nom FROM Auteurs AS a
    Ca fonctionne sans broncher ! Ca résout mes problèmes (parce que des champs "nom" et "adresse" il y en a légion sur toutes mes tables donc vous imaginez avec tous les INNER JOIN...), mais je persiste à être perplexe sur le fait que préfixer avec la table provoque une erreur d'exécution. Ca coince au niveau de Framework vu que c'est tout à fait normal au niveau de Transac SQL.

    En tout cas j'ai compris pourquoi mes confrères programmeurs utilisent en abondance les alias. Ce n'est pas seulement pour économiser leurs petits doigts à répéter le nom des tables.

    En tout cas c'est un problème résolu grâce au coup de patte de sevyc64
    "Toute l'histoire de l'informatique n'a été que l'histoire des systèmes d'exploitations" (Le Manifeste du PC)

  5. #5
    Membre expert
    Avatar de Chauve souris
    Homme Profil pro
    amateur (éclairé ?)
    Inscrit en
    Novembre 2005
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Paraguay

    Informations professionnelles :
    Activité : amateur (éclairé ?)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 186
    Points : 3 086
    Points
    3 086
    Par défaut C'est résolu, mais j'ai dis des sottises précédemment
    En fait ce n'est nullement la requête SQL qui pose problème. Si elle est correcte pour Transact-SQL on peut se demander pourquoi Visual Studio via Framework 4 la refuserait. Donc préfixer les champs par les noms des tables est tout à fait correct. Par contre il est interdit, sous peine d'erreur d'exécution, d'y mettre une clause GROUP BY. ORDER BY est accepté mais ne produit aucun effet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                string strRequete =
                    "SELECT Auteurs.Nom, Auteurs.Prénom, Ouvrages.Titre, " +
                    "Ouvrages.[Sous-titre], Catégories.[Nom de la catégorie], " + 
                    "Editeurs.Nom AS Editeur, Collections.[Titre de collection] " +
                    "FROM Catégories INNER JOIN " +
                    "Auteurs INNER JOIN " +
                    "Editeurs INNER JOIN " +
                    "Collections ON  " +
                    "Editeurs.éditeurID = Collections.éditeurID INNER JOIN " +
                    "Ouvrages ON Editeurs.éditeurID = Ouvrages.éditeurID AND " + 
                    "Collections.collectionID = Ouvrages.collectionID ON  " +
                    "Auteurs.auteurID = Ouvrages.auteurID ON " + 
                    "Catégories.catégorieID = Ouvrages.catégorieID ";
    C'est dans l'utilisation de la fonction Executereader() qu'on ne peut se permettre de préfixer le champ par le nom de la table, c'est interdit.

    Mais alors comment lever les ambigüité des noms de champs ? Car avec des champs "noms" et "prénoms" il peut y en avoir légion avec des tables de "représentants", "clients", "auteurs", "fournisseurs", etc.

    C'est là où les alias sont utiles, mais ils doivent être mis dans la requête SQL et uniquement dans elle. Dans le cas ci-dessus "Nom" est présent à la fois dans la table Editeurs et Auteurs. En faisant un alias "Editeur" pour Editeurs.Nom l'ambigüité est levée et le code ci-dessous fonctionne sans problème

    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
    var result = new DC.Ouvrages_par_auteur();
                using (var cn = new SqlConnection(BibliWM.DA.Properties.Settings.Default.BibliWMConnectionString))
                {
                    cn.Open();
                    var cd = new SqlCommand(strRequete, cn);
                    using (var dr = cd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            result.Add
                                (
                                new DC.Ouvrage_par_auteur()
                                {
                                    strNom = dr["Nom"] != DBNull.Value ? (string)dr["Nom"] : string.Empty,
                                    strPrénom = dr["Prénom"] != DBNull.Value ? (string)dr["Prénom"] : string.Empty,
                                    strTitre = dr["Titre"] != DBNull.Value ? (string)dr["Titre"] : string.Empty,
                                    strSousTitre = dr["Sous-titre"] != DBNull.Value ? (string)dr["Sous-titre"] : string.Empty,
                                    strNomCatégorie = dr["Nom de la catégorie"] != DBNull.Value ? (string)dr["Nom de la catégorie"] : string.Empty,
                                    strEditeur = dr["Editeur"] != DBNull.Value ? (string)dr["Editeur"] : string.Empty,
                                    strCollection = dr["Titre de collection"] != DBNull.Value ? (string)dr["Titre de collection"] : string.Empty,
                                }
                                );
                        }
                    }
                }
                return result;
    Donc si ma rectification d'erreur de débutant en Windows Forms peut éviter à d'autres débutants d'y tomber...
    "Toute l'histoire de l'informatique n'a été que l'histoire des systèmes d'exploitations" (Le Manifeste du PC)

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

Discussions similaires

  1. Je ne comprends pas cette requête SQL
    Par khalildz dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/11/2010, 14h00
  2. Réponses: 2
    Dernier message: 06/06/2005, 15h13
  3. Je trouve pas la requête qu'il me faut...
    Par MyGoul dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 12/05/2005, 16h29
  4. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

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