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 :

Ma requête SELECT sur des chaînes et une date ne fonctionne pas


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut Ma requête SELECT sur des chaînes et une date ne fonctionne pas
    Bonjour à tous.

    Je désire faire une requête qui recherche des personnes suivant 3 critères : nom, prénom, date de naissance.
    L'utilisateur peut mettre 1,2 ou 3 critères.

    Lorsque nom et prénom ne sont pas remplis je sais construire ma requête pour qu'il ne tienne pas compte de ces critères (valeur par défaut %).

    Par contre pour la date j'ai un problème :
    Sur Management studio la requête ci-dessous m'affiche toutes les personnes dont le champs date de naissance n'est pas NULL :

    SELECT * FROM [tbl_personnes] WHERE (([per_nom] LIKE '%%%') AND ([per_prenom] LIKE '%%%') AND ([per_dtdn] LIKE '%%%' ))

    Sur ASP.net 2 j'ai une erreur car il ne peut pas convertir la chaine en datetime. N'étant pas contrariant je modifie le type de donnée de la date de naissance qui est renvoyée par mon SQLDataSource sur asp.net (datetime en string).

    Sur ce il accepte que la date de naissance soit vide mais si je mets une date de naissance il ne retourne aucune personne !

    Si quelqu'un a déjà été confronté au problème je suis preneur d'information !

    Bonne journée

  2. #2
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    vu que tu bosses sur SQL Server, je te propose de faire une procédure stockée pour faire ça..

    ça va te faciliter grandement la vie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create procedure Ta_Procedure
    (
    @nom varchar(100) = NULL,@prenom varchar(100) = NULL,@dtdn datetime =NULL
    )
    as
     
    --tu fais ta série de tests, ici pour voir quels elements sont renseignés et construire ta requete...
    RETURN

    Evidement pour des raisons de simplicité, je te conseille de faire plusieurs requetes en fonction des parametres renseignés...
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  3. #3
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bonjour,

    tu peux aussi bien générer ta requete par code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    MaRequete = _
        "SELECT * FROM [tbl_personnes] WHERE 1 = 1 " 
     
    If RechercheParNom Then
        MaRequete &= "AND [per_nom] LIKE @Nom "
    End If
     
    If RechercheParPreNom Then
    ...

  4. #4
    Membre régulier
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    pas très propre le "1=1".

    ça serait mieux comme ça :

    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
    MaRequete = _
        "SELECT * FROM [tbl_personnes] WHERE " 
     
    dim lClauseWhere as System.Text.Stringbuilder
    If RechercheParNom Then
        lClauseWhere.Append("[per_nom] LIKE @Nom AND ")
    End If
     
    If RechercheParPreNom Then
    ...
     
    'pour enlever le " AND " de la fin
    If Not String.IsNullOrEmpty(lClauseWhere.ToString) Then
    MaRequete &= lClauseWhere.ToString.substring(0, lClauseWhere.length - 5)
    'execution de la requete
    End If

  5. #5
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'pour enlever le " AND " de la fin
    If Not String.IsNullOrEmpty(lClauseWhere.ToString) Then
    MaRequete &= lClauseWhere.ToString.substring(0, lClauseWhere.length - 5)
    'execution de la requete
    End If

    Franchement....

    Je préfère ma solution pas très propre ...

    J'ai déjà détecté un risque de bug avec la tienne...

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Le problème du 1=1 est que SQL serveur risque de na pas retrouver l'index à utiliser
    J'ai le cas avec l'application sur laquelle je travaille en ce moment et là, en fonction du nombre d'enregistrements de la table, les temps de réponse explosent
    On peut donc forcer l'index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select xx from LaTable With (Index(NomIndex))
    Where 1=1
    and ...

  7. #7
    Membre régulier
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Kelpan Voir le message
    J'ai déjà détecté un risque de bug avec la tienne...
    quel risque tu as trouvé stp?

  8. #8
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Citation Envoyé par Delphi-ne Voir le message
    Le problème du 1=1 est que SQL serveur risque de na pas retrouver l'index à utiliser
    J'ai le cas avec l'application sur laquelle je travaille en ce moment et là, en fonction du nombre d'enregistrements de la table, les temps de réponse explosent
    On peut donc forcer l'index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select xx from LaTable With (Index(NomIndex))
    Where 1=1
    and ...
    Je ne vois pas en quoi le test de 2 constantes à un rapport avec l'index à utiliser.
    Quoiqu'il en soit, je ne m'avance pas et ce que tu affirmes mérite une étude un peu plus poussé.

    Citation Envoyé par robri Voir le message
    quel risque tu as trouvé stp?
    Je te mets sur la voie, si l'utilisateur décide de ne faire aucunes sélections, quelle sera ta requete ?

  9. #9
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut Procédure Stockée
    Bonjour et merci pour vos réponses.

    La solution est effectivement d'utiliser une procédure stockée.

    Cependant ma méthode n'est pas très élégante pour la date : j'ai mis une valeur par défaut sur le serveur asp sous forme de chaîne.
    La procédure stockée teste la valeur de la chaîne et applique une requête différente s'il y a une valeur date envoyé ou non.

  10. #10
    Membre régulier
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Kelpan Voir le message
    Je te mets sur la voie, si l'utilisateur décide de ne faire aucunes sélections, quelle sera ta requete ?
    il n'y aura tout simplement pas de requète.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Not String.IsNullOrEmpty(lClauseWhere.ToString) Then
    MaRequete &= lClauseWhere.ToString.substring(0, lClauseWhere.length - 5)
    'execution de la requete
    End If
    vu que je lance la requète seulement si la clause where n'est pas vide.

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

Discussions similaires

  1. [AC-2010] Requête basée sur la semaine d'une date
    Par SBIBobinette dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 12/03/2014, 05h30
  2. Binding sur les SelectedItems d'une ListBox ne fonctionne pas entièrement
    Par takinelinfo dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 14/06/2011, 10h46
  3. Requête "select" sur deux tables dont une vide
    Par Torgar dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/10/2009, 09h27
  4. requête sur des chaînes de caractères
    Par Mlude dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/08/2006, 20h52
  5. Réponses: 4
    Dernier message: 27/05/2006, 20h30

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