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#

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 42
    Points : 30
    Points
    30
    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
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    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).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    Par défaut
    Les colonnes en base de données sont de type char ou varchar ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

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

  6. #6
    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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    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

  7. #7
    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é ?

  8. #8
    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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    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

  9. #9
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    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 ;
    }
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par hegros Voir le message
    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 ;
    }
    je pense que c'est du Linq To DataSet que tu fais et pas du Linq To Object

  11. #11
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    je pense que c'est du Linq To DataSet que tu fais et pas du Linq To Object
    Oui mais pour moi un DataSet est un objet

    Dans la théorie je sais que les noms ont quelques peu changé et qu'il y a des linq to quelque chose qui ont disparu ou qui ont été renommée.

    De plus le AsEnumerable() renvoit plutôt des objets (une collection). C'est le foutu dataset qui fait que je passe par Linq to Dataset plutôt que Linq To Object ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par hegros Voir le message
    Oui mais pour moi un DataSet est un objet

    Dans la théorie je sais que les noms ont quelques peu changé et qu'il y a des linq to quelque chose qui ont disparu ou qui ont été renommée.

    De plus le AsEnumerable() renvoit plutôt des objets (une collection). C'est le foutu dataset qui fait que je passe par Linq to Dataset plutôt que Linq To Object ?
    un lien

  13. #13
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Oui merci j'avais vu. En fait la confusion vient du fait que la requête Linq ci-dessus utilise les 2 (linq to dataset/object)

    Les IEnumerable c'est le boulot de Linq To Objects et c'est bien ce qui est fait avec AsEnumerable()
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par hegros Voir le message
    Oui merci j'avais vu. En fait la confusion vient du fait que la requête Linq ci-dessus utilise les 2 (linq to dataset/object)

    Les IEnumerable c'est le boulot de Linq To Objects et c'est bien ce qui est fait avec AsEnumerable()
    Ben t'as raison, mais Microsoft qui dis le contraire.

  15. #15
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Ben t'as raison, mais Microsoft qui dis le contraire.
    Non je dis peut-être une connerie en interprétant ce que dis Microsoft.


    Citation Envoyé par msdn
    LINQ to Objects fait référence à l'utilisation directe de requêtes LINQ avec n'importe quelle collection IEnumerable ou IEnumerable<T>

    Il me semble bien que AsEnumerable() sur un dataset renvoit une collection de IEnumerable, d'où le mélange/confusion entre linq object/dataset
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  16. #16
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Hahaha! Ma question préférée lorsque je fais passer un entretien d'embauche!
    Alors, la différence entre IEnumerable et IQueryable.
    Tant qu'on utilise IQueryable, toutes les clauses LINQ seront traduites en SQL. C'est seulement lors du AsEnumerable que les données sont fetchées de la base.
    Point de détails un peu tricky et qui peut changer totalement les perfs!

  17. #17
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    Hahaha! Ma question préférée lorsque je fais passer un entretien d'embauche!
    Elles sont pointues tes questions quand même, tu recherches quel niveau ?

    Alors, la différence entre IEnumerable et IQueryable.
    Tant qu'on utilise IQueryable, toutes les clauses LINQ seront traduites en SQL. C'est seulement lors du AsEnumerable que les données sont fetchées de la base.
    Point de détails un peu tricky et qui peut changer totalement les perfs!
    Est-ce que tu as un article (sur développez) qui compare clairement les 2 ?

    Et pour répondre à la question clairement : c'est du linq to object ou linq to dataset ou les 2 pour l'exemple de requête de mon post précédent.

    J'ai trouvé ce premier article mais c'est relativement pauvre et ce second article. Et un troisième pour la route

    Si je comprends bien c'est plus performant avec IEnumerable selon l'article 1 et le IQueryable pour l'article 2 ? Tu as un article ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  18. #18
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par hegros Voir le message
    Elles sont pointues tes questions quand même, tu recherches quel niveau ?
    C'est juste pour ouvrir le débat Même si le candidat ne sait pas (surtout si il ne sait pas en fait) je regarde le raisonnement qu'il tient.

    Citation Envoyé par hegros Voir le message
    Est-ce que tu as un article (sur développez) qui compare clairement les 2 ?

    Et pour répondre à la question clairement : c'est du linq to object ou linq to dataset ou les 2 pour l'exemple de requête de mon post précédent.

    J'ai trouvé ce premier article mais c'est relativement pauvre et ce second article. Et un troisième pour la route

    Si je comprends bien c'est plus performant avec IEnumerable selon l'article 1 et le IQueryable pour l'article 2 ? Tu as un article ?
    Essaie de faire un test sur un table de 100lignes dont 20 lignes contiennent abc comme valeur et intercepte les requêtes SQL des trois requêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaTable.AsQueryable().Where(l=>l.Field=="abc").First()
    MaTable.AsQueryable().Where(l=>l.Field=="abc").AsEnumerable().First()
    MaTable.AsEnumerable().Where(l=>l.Field=="abc").First()
    Première ligne tu rappatries 1 ligne (clause where executée sur sql, top en sql)
    Seconde ligne tu rappatries 20 lignes (clause where executée sur sql, top en mémoire)
    Dernière ligne tu rappatries ta table entière(clause where executée en mémoire, top en mémoire)

  19. #19
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    Essaie de faire un test sur un table de 100lignes dont 20 lignes contiennent abc comme valeur et intercepte les requêtes SQL des trois requêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaTable.AsQueryable().Where(l=>l.Field=="abc").First()
    MaTable.AsQueryable().Where(l=>l.Field=="abc").AsEnumerable().First()
    MaTable.AsEnumerable().Where(l=>l.Field=="abc").First()
    Première ligne tu rappatries 1 ligne (clause where executée sur sql, top en sql)
    Seconde ligne tu rappatries 20 lignes (clause where executée sur sql, top en mémoire)
    Dernière ligne tu rappatries ta table entière(clause where executée en mémoire, top en mémoire)
    Ok mais AsQueryable n'existe pas pour une DataTable donc ton code ne compile pas. A moins que tu sois en .NET 4 ?

    Pour me défendre je dirais que d'une part je ne sais pas si la DataTable utilisée est connectée à une base de données (qu'est-ce qui permet de l'affirmer) et d'autre part cette datatable peut être remplie et filtrée à une liste d'utilisateur d'un groupe ou autre chose provenant d'une autre requête déjà executé en base.Soit le problème de performance est à relativiser.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  20. #20
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    J'avoue ne jamais utiliser de Dataset ni de Datatable.
    Je travaille avec Linq to SQL ou EF

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