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 :

SQLDataSource et la clause where : comment la rendre optionnelle ?


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut SQLDataSource et la clause where : comment la rendre optionnelle ?
    Bonjour à tous,

    En ASP.NET 4.0, j’utilise un SQLDataSource.
    Dans la requête select, j’ai une clause Where avec un paramêtre.

    Code ASP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <asp:SqlDataSource ID="sourceProduit" runat="server" ConnectionString="<%$ ConnectionStrings:BlaBlaConnectionString %>"
    SelectCommand=" SELECT Produit.numProduit, Produit.nomProduit 
    FROM Produit INNER JOIN RelClientProduit ON RelClientProduit.numProduit = Produit.numProduit
    WHERE RelClientProduit.numClient = @numClient">
         …
    </asp:SqlDataSource>

    Seulement, il arrive que parfois que dans certains cas d’affichage de ma page, je veuille avoir tous mes produits sans la condition sur numClient, autrement dit sans la clause where.

    • Solution bête COPIER COLLER :

    La solution la plus bête est de créer deux SQLDataSource, un avec et un sans la clause where, et changer celui qui « binde » ma grille. Sauf que quand on a de multiples paramètres : LOL.
    • Solution avec LIKE :

    Il y a une autre solution avec un LIKE ‘@numClient’. On donne ‘%’ comme valeur lorsque l’on veut tout selectionner.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Produit.numProduit, Produit.nomProduit
    FROM Produit INNER JOIN RelClientProduit ON RelClientProduit.numProduit = Produit.numProduit
    WHERE RelClientProduit.numClient LIKE @numClient

    Je ne suis pas arrivé à la faire marcher lors du test dans l’interface de création de datasource… ça plante avec ‘%’ … alors que ça marche lorsque qu’on tape la requête directement dans SQL Management Studio... grrrrrrrrrr

    • Solution avec un autre paramêtre :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Produit.numProduit, Produit.nomProduit
    FROM Produit INNER JOIN RelClientProduit ON RelClientProduit.numProduit = Produit.numProduit 
    WHERE 
    ((RelClientProduit.numClient = @numClient) AND (@etat = ‘UNSEULCLIENT’))
    OR (@etat = ‘TOUSLESCLIENTS’)

    Ici mon paramètre @etat est donc celui qui dit si oui ou non je veux tous les produit d’un client (@etat = ‘UNSEULCLIENT’) ou tout les produits tout cour (@etat = ‘TOUSLESCLIENTS’).
    La requête marche bien dans SQL Server Management Studio et dans le concepteur de requête (première étapes de configurer la source de données)




    mais elle ne marche pas @etat = ‘TOUSLESCLIENTS’ à la dernière étape de configurer la source de données… c'est fou ! Elle marchait 3 clics avant...




    Ca fait 3 jours que je bloque sur ce truc… je m’en remets donc à vous…

    Merci d’avance pour votre aide.
    Images attachées Images attachées    

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 147
    Points : 174
    Points
    174
    Par défaut
    As tu essayer '%' +param , ou param est un paramètre, de la session par exemple, contenant la chaîne vide? Ou bien faut-il échapper le %?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    Ok je vais re-essayé ça, car du coup, je doutais de la possibilité d'utiliser LIKE ou '%' avec un type "int".

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 147
    Points : 174
    Points
    174
    Par défaut
    En fait dans la configuration d'une sqlDatasource en mode design si on choisit LIKE il rajoute automatiquement %, avant et après, le paramètre qu'on lui donne(tu peux le voir dans le html).Donc en théorie la chaîne vide devrait convenir.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    Bon j'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE     (RelClientProduit.numClient LIKE '%' + CAST(@numClient AS VarChar(5)))
    Cela me retourne tout les produits donc le numClient... se finit par le paramètre saisi.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    C'est bon !

    Voici la solution : caster l'id en string et utilisé un nombre ou %

    WHERE (CAST(RelClientProduit.numClient AS VarChar(5)) LIKE @numClient)

    Seul défaut : c'est très coûteux ! Donc à éviter si vous avez de grosse bases !


    Merci de ton aide davjan ^^

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    Bon en fait non, ça ne marche pas....



    EDIT :

    Si ça marche,

    Ma clause where est sur une relation nn, il manquit juste un petit Distinct au bon endroit :

    SELECT DISTINCT .......

  8. #8
    Membre habitué Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Points : 155
    Points
    155
    Par défaut Code Behind
    A mon avis il faut passer par le code behind et constituer la chaîne SQL en fonction des paramétres passés à une fonction ...

    Un truc de ce genre :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
     
     
           /// <summary>
                /// Envois la liste des dossiers du personnel
                /// </summary>
                /// <param name="Mode">1 = Dossiers en ligne / 2 = Dossiers archivés</param>
                /// <param name="Filtre">Chaine filtre sur le nom</param>
                /// <param name="Lettre">Lettre filtre sur la première lettre du nom</param>
                /// <returns>Liste d'objets personnel</returns>
                public List<Personnel> EnvoisLaListeDesDossiersDuPersonnel(int Mode, string Filtre, string Lettre)
                {
                    {
     
                        string SQL = string.Empty;
                        string Tri = " ORDER BY Nom";
     
                        SQL = "SELECT * FROM VuePERListeDesDossiers ";
     
                        switch (Mode)
                        {
                            ///DOSSIERS EN LIGNE
                            case 1:
                                {
     
                                    if (Filtre != null)
                                    {
                                        Filtre = " WHERE ARCHIVE=0 AND Nom LIKE '%" + Filtre + "%'";
                                    }
     
                                    if (Lettre != null)
                                    {
                                        Filtre = " WHERE ARCHIVE=0 AND Nom LIKE '" + Lettre + "%'";
                                    }
     
                                    if ((Filtre == null) || (Lettre == null))
                                    {
                                        Filtre = " WHERE ARCHIVE=0 ";
                                    }
                                    break;
                                }
                            ///DOSSIERS ARCHIVES
                            case 2:
                                {
                                    if (Filtre != null)
                                    {
                                        Filtre = " WHERE ARCHIVE=1 AND Nom LIKE '%" + Filtre + "%'";
                                    }
     
                                    if (Lettre != null)
                                    {
                                        Filtre = " WHERE ARCHIVE=1 AND Nom LIKE '" + Lettre + "%'";
                                    }
     
                                    if ((Filtre == null) || (Lettre == null))
                                    {
                                        Filtre = " WHERE ARCHIVE=1 ";
                                    }
                                    break;
                                }
     
                        }
                        SQL = SQL + Filtre + Tri;
     
                        DataTable MaTable;
     
                        try
                        {
                            MaTable = BaseDeDonnees.RenvoisDataTable(SQL);
     
                            List<Personnel> Liste = new List<Personnel>();
     
     
                            for (int i = 0; i < MaTable.Rows.Count; i++)
                            {
                                Personnel Pers = new Personnel(int.Parse(MaTable.Rows[i]["IdPersonnel"].ToString()), 1);
                                Liste.Add(Pers);
                                Pers = null;
                            }
     
                            MaTable.Clear();
                            return Liste;
     
                        }
                        catch (Exception Erreur)
                        {
                            throw Erreur;
                        }
                    }
                }

Discussions similaires

  1. Comment ignorer la sélection de la clause WHERE.
    Par ABandApart dans le forum Requêtes
    Réponses: 6
    Dernier message: 11/06/2012, 12h05
  2. Réponses: 8
    Dernier message: 19/05/2011, 14h33
  3. [SQL] Comment ne pas exécuter une clause WHERE si une var est nulle
    Par charlysquare dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/05/2006, 22h12
  4. Réponses: 1
    Dernier message: 03/02/2006, 13h35
  5. Réponses: 3
    Dernier message: 11/12/2005, 12h15

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