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

VB.NET Discussion :

Detection de colonne dans une req [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut Detection de colonne dans une req
    Bonjour,
    J'ai un petit soucis avec l’exécution de ma requête sql en VB.Net qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT t.*, (SELECT COUNT(*) FROM SqlTest010_Piv piv WHERE piv.idT10_2_Piv = t.idT10 AND piv.idT10_1_PIV=@id) AS nbItem FROM (SELECT DISTINCT idT10, titleT10 FROM SqlTest010) AS t
    Hors je comprends pas pourquoi cela ne fonctionne pas alors que Sql Serveur la Req est OK.
    System.ArgumentException: La colonne 'nbItem' n'appartient pas à la table Table. à System.Data.DataRow.GetDataColumn(String columnName) à System.Data.DataRow.get_Item(String columnName) à pTest010.LoadItem(Int32 pId, String pAction)
    Merci de votre aide

  2. #2
    Membre chevronné Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Par défaut
    Bonjour ,

    Je me trompe peut être.
    Le 'AS' te sert dans ton requêteur pour nommer une colonne à ta guise pour l'affichage . Au niveau du code comme tu ne récupères que des informations , cela est inutile .

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut
    Bonjour @WaterTwelve21,
    j'en ai besoin car je m'en sert pour sélectionner la colonne dans mon DataSet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim slctValue As Integer = CInt(DS.Tables(i).Rows(j)("nbItem"))

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Du coup c'est plus du SQL, donc tu aurais plus de réponse dans le forum sql.
    Cela dit, avant d'aller heurter les yeux de nos experts SQL, dis nous ce que ta rêquete doit faire, parce que la sans être expert je peux dire qu'il y a des chose qui ne vont pas... ou du moins qui pourraient être bien meilleures, par exemple je penses que tu pourrais faire une jointure entre tes 2 tables SqlTest010_Piv et SqlTest010 plutôt qu'une sous-requête. De même, je pense que tu aurais pu utiliser un group by pour remplacer ta 2ème sous requête qui ne fait qu'un distinct.

    ça pourrait donner un truc comme =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t.idT10, t.titleT10, Count(*) as nbItem
    FROM SqlTest010 t
    Inner join SqlTest010_Piv piv on t.idT10 = piv.idT10_2_Piv
    WHERE piv.idT10_1_PIV = @id
    Group by t.idT10, t.titleT10
    Bon après je suis peut être a coté de la plaque, faut savoir ce que tu veux faire

    J@ck.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut
    Bonjour @J@ckHerror,


    Non je ne pense pas que cela intervienne sur le forum SQL, puisque l'erreur vient du VB. il semble ne pas interpréter le "AS nbItem"

    Grosso-merdo, j'ai trois tables; une qui me renvois un ID (mon paramètre @id), une seconde SqlTest010 qui est constitué avec (idT10,titleT10), et une troisième table qui est mon pivot SqlTest010_Piv entre ces deux tables qui est constitué (idT10_1_PIV, idT10_2_PIV); idT10_1_PIV = @id, et idT10_2_PIV = idT10.
    Je me sers de SqlTest010 pour remplir un listBox, et le pivot me sert à cocher les cases correspondant à mon @id.
    et c'est donc au niveau de la récupération de la colonne "nbItem" que le listBox génère une erreur car côté SQL la req est Ok.

    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
     
                    For j As Integer = 0 To DS.Tables(i).Rows.Count - 1
     
                        Dim idValue As Integer = CInt(DS.Tables(i).Rows(j)("idT10"))
                        Dim strValue As String = "[" & idValue.ToString() & "] " & Trim(DS.Tables(i).Rows(j)("titleT10").ToString() & "")
                        Dim slctValue As Integer = CInt(DS.Tables(i).Rows(j)("nbItem"))
     
                        Dim rcbi As New RadListBoxItem()
                        rcbi.Value = idValue
                        rcbi.Text = strValue
                        If (slctValue > 0) Then
                            rcbi.Checked = True
                        End If
                        rlbItem.Items.Add(rcbi)
                        rcbi = Nothing
                    Next
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM SqlTest010
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    idT10       titleT10
    ----------- --------------------------------------------------
    1           TEST 1
    2           TEST 2
    3           TEST 3
    4           TEST 4
    5           TEST 5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM SqlTest010_Piv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    idT10_Piv   idT10_1_Piv idT10_2_Piv
    ----------- ----------- -----------
    5           1           1
    6           1           3
    7           1           5
    8           2           4
    9           2           5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT t.*, (SELECT COUNT(*) FROM SqlTest010_Piv piv WHERE piv.idT10_2_Piv = t.idT10 AND piv.idT10_1_PIV=@id) AS nbItem FROM (SELECT DISTINCT idT10, titleT10 FROM SqlTest010) AS t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    idT10       titleT10                                           nbItem
    ----------- -------------------------------------------------- -----------
    1           TEST 1                                             1
    2           TEST 2                                             0
    3           TEST 3                                             1
    4           TEST 4                                             0
    5           TEST 5                                             1
    J'ai déjà essayé les jointures mais ce n'est pas ce que je recherche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t.idT10, t.titleT10, Count(*) as nbItem
    FROM SqlTest010 t
    Inner/Left/Right join SqlTest010_Piv piv on t.idT10 = piv.idT10_2_Piv
    WHERE piv.idT10_1_PIV = @id
    Group by t.idT10, t.titleT10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    idT10       titleT10                                           nbItem
    ----------- -------------------------------------------------- -----------
    1           TEST 1                                             1
    3           TEST 3                                             1
    5           TEST 5                                             1

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par mGraph Voir le message
    J'ai déjà essayé les jointures mais ce n'est pas ce que je recherche.
    Tu fais un produit cartesien. En gros, tu multiplies les "petits pains", mais sans t'en rendre compte. Tu peux regarder le plan d'execution de ta requete : faire cela revient a mettre ton serveur a genou surtout s'il y a de la volumetrie et/ou du traffic. Ce genre d'ecriture SQL c'etait utilise dans les annees 90. Aujourd'hui il existe une ecriture normalisee pour les jointures et il FAUT les utiliser car les SGBDR modernes sont optimises pour cela. Si tu veux creuser : LE SQL de A à Z : 3e partie - les jointures.

    La suggestion de requete de J@ckHerror revient au meme resultat que ta requete, mais le plan d'execution est optimise ! A noter, il faut utiliser un LEFT JOIN et non un INNER JOIN si tu veux faire remonter les 0.

    Pour le probleme du DataSet, 3 questions :
    1 - Comment est-ce que tu remplis ton DataSet ? Poste-nous le code STP.
    2 - Est-ce que tu es dans la bonne table du DataSet quand tu fais DS.Table(i) ?
    3 - Les DataSet ca fait partie de la prehistoire de .NET. C'est lourd a charger et a utiliser car il y a tout un tas de fonctionnalites qui viennent avec et que tu n'utiliseras pas. Pour faire bref, le DataSet etait super utile avant que Microsoft n'implemente les listes et autres collections... C'est-a-dire avant .NET 1.1. Pourquoi n'utilises-tu pas un DataReader et une simple liste d'objets ? Tu auras plus de controle sur le chargement des donnees, sans l'overhead du DataSet.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2006
    Messages : 132
    Par défaut
    mGraph,
    essaie plutôt cela côté SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t.idT10, t.titleT10,  Count(piv.idT10_Piv) as nbItem
    FROM SqlTest010 t 
    LEFT OUTER JOIN SqlTest010_Piv piv ON t.idT10 = piv.idT10_2_Piv 
    AND piv.idT10_1_PIV = @id 
    GROUP BY t.idT10, t.titleT10
    Car j'imagine que si tu exécute un If > 0 c'est que tu as besoin d'avoir les retours à 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If (slctValue > 0) Then
         rcbi.Checked = True
    End If
    EDIT : Concernant le DataSet/DataReader voilà un post MSDN un peu vieillot mais bien construit : https://msdn.microsoft.com/en-us/library/ms978388.aspx

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut
    Ok Merci @Misoss au moins ma requête fait moins année 90 :p, mais sa ne fonctionne toujours pas côté VB .

    @DotNetMatt,
    1. A ton grand désarroi le projet étant ancien, la requête est passé par un "executeDataset".
    2. Oui sans problème.
    3. Je n'utilise pas de datareader car je dois respecter la structure d'origine du projet... Et sinon je comprends pas l’intérêt que j'ai de construire une collection d'objet, alors que mon DataSet remplis cette tache, car il me semble que dans mon cas cela ne ferais qu'effectuer une opération de plus, non?

    Mais bon cela n'explique pas pourquoi il n’interprète pas le nom de la colonne "virtuel" nbItem.

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

Discussions similaires

  1. [WD14] Detection déplacement d'une colonne dans une table
    Par cybermat3 dans le forum WinDev
    Réponses: 2
    Dernier message: 19/03/2010, 10h09
  2. Noms de colonne dans une colonne
    Par Digirom dans le forum Langage SQL
    Réponses: 14
    Dernier message: 23/04/2004, 11h51
  3. Réponses: 4
    Dernier message: 03/03/2004, 11h04
  4. Changements de colonnes dans une BDD MySQL
    Par arnaud_verlaine dans le forum Requêtes
    Réponses: 8
    Dernier message: 07/08/2003, 11h33
  5. Ajout d'une colonne dans une table ...
    Par Djedjeridoo dans le forum SQL
    Réponses: 2
    Dernier message: 22/07/2003, 16h12

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