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

C# Discussion :

Comparer deux chaines en c#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 42
    Par défaut Comparer deux chaines en c#
    Bonjour,

    j'ai réalisé un code d'authentification permettant à un utilisateur de se connecter à l'application .

    pour cela j'accède à la base de données et je vérifie si les informations saisies par l'utilisateur existent dans la base de données ou non.

    voici le code que j'ai développer :
    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
     
     public bool authentifier(string log, string pass) 
            {
                string l="", p="";
                bool trouve=false;
                int n=0;
     
                foreach (DataRow row in datast.Tables["utilisateur"].Rows)
                {
     
                    l = (string) datast.Tables["utilisateur"].Rows[n].ItemArray[0];
                    p = (string) datast.Tables["utilisateur"].Rows[n].ItemArray[1];
     
                    if (l.Equals(log) == true) 
                    {
                        if (p.Equals(pass) ==true) 
                        {
                            trouve = true; ;
                        }
                    }
                    n++;
                }
                return trouve;
     
            }
    J'ai controlé la valeur du trouve dans le traitement suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                 bool valid;
                valid = user.authentifier(this.textBox_login.Text,      this.textBox_pass.Text);
                if (valid == true) { this.Close(); }
                else MessageBox.Show("Le nom d'utilisateur ou le mot de passe est invalide !");
    Mais dans l'exécution , toujours le message " nom....invalide" est affiché.
    quand j'ai fait quelques vérifications j'ai trouvé que le l et le p contiennent toujours des données et que le programme n'entre pas à l'intruction if même si la condition est réalisée .

    quelqu'un peut m'aider à résoudre ce problème??

    merci

    SQL Server 2000
    visual c# expess 2008

  2. #2
    Invité
    Invité(e)
    Par défaut
    j'ai l'impression que tu te "pourris" la vie !

    Bon je ne sais d'ou provient l'erreur.
    mais je pense que la fonction ci-dessous est plus simple et plus rapide que tes boucles for imbriquées :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public bool authentifier(string log, string pass)
    {
        DataTable table = DataSet1.Tables["utilisateur"];
        string expression;
        expression = string.Format("Login = '{0}' and Password = '{1}'", log, pass);
        DataRow[] foundRows;
     
        foundRows = table.Select(expression);
     
        return foundRows.Length == 1;
    }

    Notes que Login et Password qui sont dans la variable expression doivent être des champs existant dans la table utilisateur.

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    j'ai l'impression que tu te "pourris" la vie !

    Bon je ne sais d'ou provient l'erreur.
    mais je pense que la fonction ci-dessous est plus simple et plus rapide que tes boucles for imbriquées :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public bool authentifier(string log, string pass)
    {
        DataTable table = DataSet1.Tables["utilisateur"];
        string expression;
        expression = string.Format("Login = '{0}' and Password = '{1}'", log, pass);
        DataRow[] foundRows;
     
        foundRows = table.Select(expression);
     
        return foundRows.Length == 1;
    }

    Notes que Login et Password qui sont dans la variable expression doivent être des champs existant dans la table utilisateur.
    Et si le mot de passe contient une quote (') ?
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Arnaud F. Voir le message
    Et si le mot de passe contient une quote (') ?
    pas de problème.

    as-tu testé ?

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Je dois avouer que non
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Je ne sais pas pour les quotes (pas testé avec Selection(expression)) sinon on peut faire du linq to object ce qui reviens à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public bool authentifier(string log, string pass)
    {
        return  (from ds in DataSet1.Tables["utilisateur"].AsEnumerable()
                         where ds["Login"].Equals(log) && ds["Password"].Equals(pass)
                   select ds).Count()  == 1 ;
    }

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Déjà on ne comprends pas pourquoi tu fais une boucle sur les lignes pour ensuite utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l = (string)datast.Tables["utilisateur"].Rows[n].ItemArray[0]

    Il eut été plus logique de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l = (string)row.ItemArray[0]
    quoique ce dernier est inutilement illisible.

    Le code normal est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l = (string)row["NomDuChamp"];
    Sinon, pour la comparaison de chaine utiliser la méthode statique Compare:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String.Compare(chaine1, chaine2, true);
    (true pour comparaison case insensitive, false pour une comparaison case sensitive).

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Les colonnes en base de données sont de type char ou varchar ?

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 42
    Par défaut
    les colonnes sont de type varchar

Discussions similaires

  1. Comparer deux chaines
    Par gferrier dans le forum Langage
    Réponses: 1
    Dernier message: 21/03/2007, 15h43
  2. Comparer deux chaines
    Par ponpon17430 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/09/2006, 23h20
  3. Réponses: 4
    Dernier message: 08/09/2006, 09h41
  4. Comparer deux chaines de caractères dans un if ?
    Par Xplosif² dans le forum C++
    Réponses: 6
    Dernier message: 25/02/2006, 19h21
  5. comparer deux chaines de caractères
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 14h31

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