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

ASP.NET Discussion :

Problême pour passer une variable dans un SelectCommand


Sujet :

ASP.NET

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Problême pour passer une variable dans un SelectCommand
    Bonjour.

    J'ai un petit problême assez embetant dans mon code lorsque je veux passer une variable de session dans une requete sql.
    Voila, je rentre dans ma variable de session des valeurs stockées en string et toutes entourées de simple quote ( ' ).
    Le probleme est que lorsque je fais passer cette variable dans ma requête, je pense que visual entoure toute ma chaine de caractère propre à lui et du coup, ma requête ne fonctionne pas comme je le souhaite.

    Voila du code pour etre plus parlant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    en VB:
            Session("var")="'006','007','008'"
     
    en Asp.net:
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:test.INFO %>"
            ProviderName="<%$ ConnectionStrings:test.INFO.ProviderName %>" SelectCommand='SELECT LIBELLE_SECTION FROM SOMA_SECTION WHERE CODE_SECTION IN (:test)'>
            <SelectParameters>
                <asp:SessionParameter Name="test" SessionField="var" Type="String"  />
            </SelectParameters>
        </asp:SqlDataSource>
    Je pense que du coup le compilateur lit la requete comme ca:
    SELECT LIBELLE_SECTION FROM SOMA_SECTION WHERE CODE_SECTION IN (' '006','007','008' ')

    Forcement, la requete n'est plus bonne.

    Quelqu'un aurait-il une idée à ce sujet.

    En espérant etre clair, je vous souhaite une bonne apres midi

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    La clause IN est toujours une galère à gérer, je ne connais malheureusement pas de solution pour ce problème. Tu as raison la requête est effectivement évaluée comme si la clause IN n'était qu'une seule et unique valeur et non pas comme une liste de valeurs.
    Il y a le même problème lorsque tu souhaites utiliser des paramètres SQL avec une clause IN. Dans ce cas, la solution est soit d'utiliser un paramètre pour chaque valeur du IN, soit de ne pas utiliser de paramètre SQL et de tout concaténer dans la requête directement sous forme de texte.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 122
    Points
    122
    Par défaut
    Tu pourrais construire le SelectCommand sur le Page_Load de ta page.

    Et fournir directement la requête construite à ton SqlDataSource

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Le IN attend un tableau(table)

    On a resolu ce probleme en créant une fonction SQL Serveur qui retourne la table, et dans le IN on fait un (SELECT * FROM nomfonction(@Init))

    bon courage

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos réponses rapide.

    Tu pourrais construire le SelectCommand sur le Page_Load de ta page
    J'ai en effet essayé de faire ce de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            SqlDataSource1.SelectCommand = "SELECT S.LIBELLE_SECTION FROM SOMA_SECTION S WHERE S.CODE_SECTION IN (" + Session("var") + ")"
    Ce qui devrait mieux marcher

    Mais comment puis-je faire pour fournir la requête construite au SqlDataSource ??
    Comment marche le SqlDataSource1.Select() ??


    Dans ce cas, la solution est soit d'utiliser un paramètre pour chaque valeur du IN, soit de ne pas utiliser de paramètre SQL et de tout concaténer dans la requête directement sous forme de texte.
    Je ne sais pas éxactement combien de valeur je vais avoir donc je ne peux ni stocker chaque valeur ni les entrer directement sous forme de texte.

    (En fait c'est pour améliorer le temps de réponse de grosses requetes. Je souhaiterais faire une requete qui retourne les valeurs de mon IN et les stocker dans un string pour apres vérifier si ma requete correspond bien a ces valeurs.)

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Off$ide
    Le IN attend un tableau(table)

    On a resolu ce probleme en créant une fonction SQL Serveur qui retourne la table, et dans le IN on fait un (SELECT * FROM nomfonction(@Init))

    bon courage
    Ta fonction prend en paramètre une liste de valeurs concaténées et renvoie une table temporaire contenant chacune des valeurs ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par Thetonio007
    Mais comment puis-je faire pour fournir la requête construite au SqlDataSource ??
    Ca marche ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SqlDataSource1.SqlCommand = ma_string_sql;
    SqlDataSource1.DataBind()

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par SaumonAgile
    Ta fonction prend en paramètre une liste de valeurs concaténées et renvoie une table temporaire contenant chacune des valeurs ?
    Exact, voici un extrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE FUNCTION fn_List
     ( @Init varchar(50) )
    RETURNS @List TABLE
       (
        monInit VARCHAR(50)
       )
    Et dans le @Init on envoi les valeurs séparées par des virgules, que l'on decoupe grace au CHARINDEX.

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Off$ide
    Exact, voici un extrait :
    Alors ça c'est futé, ça me plait bien comme solution.
    Je n'y avais pas pensé.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    si je supprime la définition de ma selectCommand en asp.net et que je défini la commande dans mon code behind en Vb sans pour autant faire de SqlDataSource1.Select() ou de SqlDataSource1.DataBind(), la fonction marche bien.

    Par contre mes requetes sont imposantes et je ne veux pas les voir dans mon code-behind, elles sont très bien la ou elles sont en asp.net mais ca ne marche pas dans ce cas.

    On a resolu ce probleme en créant une fonction SQL Serveur qui retourne la table, et dans le IN on fait un (SELECT * FROM nomfonction(@Init))
    comme mes requetes sont imposantes, je voulais justement limiter le nombre d'acces a la BDD, c'est pourquoi je voulais stocker toutes les valeurs d'une premieres requetes dans un string de la sorte 'val1','val2','val3'... de manière à pouvoir l'insérer dans le IN et de comparer par la suite les valeurs de mes autres requetes avec celles-ci.
    --> Moins d'accès BDD du coup et donc temps de réponse moins long.

    maintenant, en Asp, ca marchait très bien, mais en .Net, visual veut tellement nous aider que des fois, ca nous met des batons dans les roues. En l'occurence ici.

    Il faudrait un moyen pour que le compilateur de rajoute pas automatiquement de quote autour des variables que l'on transmet à la requete.

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par SaumonAgile
    Alors ça c'est futé, ça me plait bien comme solution.
    Je n'y avais pas pensé.
    A ton service

    Un grand merci à Maitre Duss qui m'a donné cette solution

  12. #12
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Thetonio007
    Il faudrait un moyen pour que le compilateur de rajoute pas automatiquement de quote autour des variables que l'on transmet à la requete.
    C'est plus compliqué que ça, cela ne vient pas du compilateur. C'est lié au SGBD. Il faut bien comprendre qu'un paramètre SQL n'est pas remplacé caractère à caractère à la place de l'identifiant. Le paramètre est envoyé au SGBD de manière séparée. Le SGBD voit arriver deux objets différents, la requête puis la valeur du paramètre. Il va ensuite formater la valeur pour la faire correspondre au type du paramètre défini (s'il y a besoin de formatage). C'est ce qui te permet de passer des datetime, ou des double sans avoir à les convertir.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  13. #13
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bien ba je vais essayer tout ca.

    Mais le but principal était de stocker mes variables dans un string en variable session de manière à vérifier directement à partir de la session et de ne pas être obligé de faire le trajet jusqu'au serveur et la BDD.

    Merci quand même pour toutes les infos.
    Un grand bravo à vous

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

Discussions similaires

  1. Problème pour passer une variable sur plusieurs fonctions
    Par pierre3401 dans le forum Général Python
    Réponses: 3
    Dernier message: 13/11/2013, 11h14
  2. Réponses: 2
    Dernier message: 10/08/2010, 11h21
  3. Fonctions setappdata et getappdata pour passer une variable dans 2 gui
    Par mihaispr dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 02/05/2009, 14h55
  4. Réponses: 3
    Dernier message: 06/06/2007, 15h21
  5. Probléme pour insérer une variable dans un champs
    Par BOUTRAIS dans le forum Access
    Réponses: 2
    Dernier message: 11/04/2006, 22h45

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