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

MS SQL Server Discussion :

Requête paramétrée et CONVERT(binary ..)


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut Requête paramétrée et CONVERT(binary ..)
    Bonjour,

    j'essaye de faire la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM licence WHERE login=@login AND motdepass=@password;
    depuis une page aspx avec du C#.

    Le problème étant que Sql Server ne respectant pas la casse dans les comparaisons de chaînes (défini à l'installation de Sql Server une fois pour toute si j'ai bien compris), j'essaye donc de faire comme expliqué sur cette page de microsoft : http://support.microsoft.com/kb/171299/fr

    et j'utilise la fonction CONVERT en binary pour obtenir de l'hexadecimal.

    Mais le vrai problème est que je constate que la requête paramétrée ne fonctionne pas si un paramètre est dans la fonction CONVERT..

    autrement di ça ne marche pas si je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CONVERT(binary, login) = CONVERT(binary, @login) AND CONVERT(binary, motdepass) = CONVERT(binary, @password)
    j'ai essayé sans faire une requête paramétrée en dur et la casse est bien respectée, .. mais j'ai besoin de passer par cette requête paramétrée...

    d'avance merci pour toute aide


    .

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Je ne vois pas le problème avec la variable, ceci passe très bien :
    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
     
    USE tempdb
    go
     
    create table T1(col1 char(5) NOT NULL, col2 int NOT NULL)
    go
    insert T1 values('John',1)
    insert T1 values('John',1)
    insert T1 values('JOhn',1)
    insert T1 values('JOhn',1)
    insert T1 values('JoHn',1)
    insert T1 values('JoHn',1)
    insert T1 values('John',1)
    insert T1 values('JohN',1)
    insert T1 values('JohN',1)
    insert T1 values('john',1)
    insert T1 values('john',1)
    insert T1 values('john',1)
    go
     
    DECLARE @var char(5)
    SET @var = 'john '
     
    SELECT *
    from T1
    where CONVERT(binary(5),col1)=CONVERT(binary(5),@var)
    Ceci dit, autre solution, passer ta colonne en collation case sensitive , ce qui améliorera les performances de recherche.

    Exemple en forçant dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    from T1
    where col1 COLLATE FRENCH_CS_AS = @var

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    Bonjour rudib,

    merci.

    Oui malheureusement en utilisant ADO.NEt en C# avec un SqlCommand paramétré, je n'arrive pas à faire fonctionner ma requête.. la variable ne passe pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string strRequete = "SELECT * FROM licence WHERE CONVERT(BINARY, login) = CONVERT(BINARY, @login) AND CONVERT(BINARY, motdepass) = CONVERT(BINARY, @password);";
    [...]
    sqlCommand.Parameters.Add(new SqlParameter("@login", login.Value));
    sqlCommand.Parameters.Add(new SqlParameter("@password", password.Value));
    -> ne marche pas, alors qu'en dur si je remplace mes variables par des 'john' (par exemple) dans ma requête, ça marche bien.


    par contre je vais essayer l'autre solution que tu me proposes et je reviens. (merci!)

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Quelques bonnes pratiques / conseils :

    - jamais de SELECT * -> liste explicitement tes colonnes
    - encapsule ton code dans des procédures stockées

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Par défaut
    rebonjour rudib,

    - d'accord pour le select * mais y a t'il une raison particulière à ne pas faire de select * je pense en voir une ou deux mais je ne suis pas certain

    - pour les procédures stockées, malheureusement nous essayons de les limiter et mettons nos requêtes dans le code c# car cela engendrerait trop de procédures stockées dans notre base

    - pour le COLLATE ça fonctionne bien merci !
    mais je me demande quelle est la meilleure "collation" et si la collation FRENCH supporterait par exemple le caractère ß qui existe en allemand.. existe t'il une collation qui regroupe tous les caractères ?
    sinon je pense que je garderai la collation FRENCH mais les login et mot de passe de ma table devront se limiter aux caractères courant (du dictionnaire français)

Discussions similaires

  1. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  2. Requête paramétrée
    Par lou.souleu dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2005, 05h36
  3. [VB.NET] [ADO.NET] Requête paramétrée
    Par DotNET74 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/03/2005, 08h39
  4. Requête paramétrée qui remplit une DBLookUpComboBox
    Par navis84 dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/12/2004, 21h23
  5. VBA & Requête paramétrée
    Par gripoil dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2004, 09h54

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