Discussion: Detection de colonne dans une req [Débutant]

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2014
    Messages : 54
    Points : 46
    Points
    46

    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 actif Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    décembre 2015
    Messages
    178
    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 : 178
    Points : 270
    Points
    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 .
    throw new NoSignatureException();

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2014
    Messages : 54
    Points : 46
    Points
    46

    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 éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    juillet 2005
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : juillet 2005
    Messages : 456
    Points : 1 159
    Points
    1 159

    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.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2014
    Messages : 54
    Points : 46
    Points
    46

    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 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : février 2010
    Messages : 3 295
    Points : 8 759
    Points
    8 759
    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

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2006
    Messages
    129
    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 : 129
    Points : 68
    Points
    68

    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 du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2014
    Messages : 54
    Points : 46
    Points
    46

    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.

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

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : février 2010
    Messages : 3 295
    Points : 8 759
    Points
    8 759
    Billets dans le blog
    3

    Par défaut

    Citation Envoyé par mGraph Voir le message
    Ok Merci @Misoss au moins ma requête fait moins année 90 :p, mais sa ne fonctionne toujours pas côté VB .
    Oui le cote SQL ne resoudra pas ton souci, mais il faut etre conscient des problemes de performance.

    Citation Envoyé par mGraph Voir le message
    1. A ton grand désarroi le projet étant ancien, la requête est passé par un "executeDataset".
    Ok si tu es sur un vieu projet tu as une bonne excuse

    Citation Envoyé par mGraph Voir le message
    2. Oui sans problème.
    Donc tu confirmes que quand tu fais DS.Table(i) tu es bien sur la bonne table ?

    Citation Envoyé par mGraph Voir le message
    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?
    Je ne savais pas que tu etais dans le contexte d'un vieu projet. Ce qu'il faut retenir c'est qu'utiliser un DataSet c'est tres lourd, quoi qu'il arrive. Si tu n'utilises le DataSet que pour recuperer des donnees, c'est encore plus vrai. Apres, comme tu es sur un projet existant, ca ne vaut peut-etre pas le coup de se lancer dans une refonte de tout ca.

    Citation Envoyé par mGraph Voir le message
    Mais bon cela n'explique pas pourquoi il n’interprète pas le nom de la colonne "virtuel" nbItem.
    Montre-nous ton code (executeDataset)
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2014
    Messages : 54
    Points : 46
    Points
    46

    Par défaut

    J'ai bien conscience pour le SQL mais je ne trouvais pas pourquoi avec le Left Join je n'avais pas les colonnes "null", et effectivement dans l'exemple de Misoss en supprimant le "WHERE" cela résout le problème.


    Concernant le code, je suis effectivement dans un projet existant, et comme je ne suis pas le dev principal je n'ai pas autorisation de modifier la structure dans sa globalité, mais j'ai bien conscience que le temps d’exécution d'un DataReader est inférieur à celui d'un DataSet.

    Sinon oui oui je confirme que nous sommes bien dans la bonne req, pour le test je suis même repassé avec un DataTable
    Concernant le remplissage de ma listBox
    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
     
    Public Sub loadItem(ByVal pID as integer)
                Dim reqSQL As String = "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 = 1 Group by t.idT10, t.titleT10"
    	    Dim rowsCountItem As Integer = 0
    	    Dim idValue As Integer = 0
                Dim strValue As String = ""
                Dim slctValue As Integer = 0
                Try
                    DT = db.ExecuteDataSet(reqSQL).Tables(0)
                     rowsCountItem  = CInt(DT.Rows.Count)
                    db.AddParameter("@id", pId)
                    For i As Integer = 0 To (rowsCountItem - 1)
                        idValue = CInt(DT.Rows(i)("idT10"))
                        strValue = "[" & idValue.ToString() & "] " & Trim(DT.Rows(i)("titleT10").ToString() & "")
                        slctValue = CInt(DT.Rows(i)("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
                Catch ex As Exception
                    DisplayErr("Debug (LoadItem) (nb Rows(" & rowsCountItem & "))" & vbCrLf & "SQL : " & reqSQL & vbCrLf & ex.ToString())
                End Try
                DT = Nothing
                db = Nothing
    End Sub
    Le code du ExecuteDataSet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Private arParams As ArrayList
        Public Function ExecuteDataSet(ByVal commandtext As String) As DataSet
            If arParams.Count > 0 Then
                Dim arParamsList() As SqlParameter = New SqlParameter(arParams.Count) {}
                For i As Integer = 0 To arParams.Count - 1
                    arParamsList(i) = New SqlParameter(CStr(arParams(i)(0)), CStr(arParams(i)(1)))
                Next
                Return SqlHelper.ExecuteDataset(cnn, CommandType.Text, commandtext, arParamsList)
            Else
                Return SqlHelper.ExecuteDataset(cnn, CommandType.Text, commandtext)
            End If
            arParams.Clear()
        End Function

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

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : février 2010
    Messages : 3 295
    Points : 8 759
    Points
    8 759
    Billets dans le blog
    3

    Par défaut

    Merci, est-ce que tu peux poster le contenu de SqlHelper.ExecuteDataset ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2014
    Messages : 54
    Points : 46
    Points
    46

    Par défaut

    Public Shared Function ExecuteDataset(connection As System.Data.SqlClient.SqlConnection, commandType As System.Data.CommandType, commandText As String, ParamArray commandParameters() As System.Data.SqlClient.SqlParameter) As System.Data.DataSet
    Membre de Microsoft.ApplicationBlocks.Data.SqlHelper
    On ne peut pas avoir accès à la fonction avec F12 ? (Visual Studio Community 2015)

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

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : février 2010
    Messages : 3 295
    Points : 8 759
    Points
    8 759
    Billets dans le blog
    3

    Par défaut

    Ah au temps pour moi, je ne savais pas que la classe SqlHelper existait dans les ApplicationBlocks...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2014
    Messages : 54
    Points : 46
    Points
    46

    Par défaut

    Bon j'ai mis à jour la DLL "Microsoft.ApplicationBlocks.Data" etc'est ok .

    En tout cas merci de votre aide

+ 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