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 :

C# + MySQL + Varbinary


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut C# + MySQL + Varbinary
    Bonsoir à tous!

    Je me décide à poster car je n'en peux plus d'essayer des trucs en vain...Je vous expose mon souci:

    J'utilise une BDD MySQL pour mon projet, laquelle contient une table qui contient un champs VARBINARY(24), dans lequel je voudrais insérer un mot de passe utilisateur depuis un formulaire C#.
    Donc pour l'INSERT je converti d'abord le STRING récupéré d'un textbox en UTF8 de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] passwordByte = System.Text.Encoding.UTF8.GetBytes(MotDePasse);
    L'INSERT se passe bien (je veux dire, pas d'erreur de syntaxe ni rien)
    Dans la BDD, je vois apparaitre System.Byte[].

    Première question: le System.Byte[] est-il normal?

    Lorsque ensuite je veux récupérer cette valeur dans un autre formulaire, je fais un SELECT motdepasse, et que je l'affiche dans un messageBox, j'obtiens: 53-79-73-74-65-6d-2e-42-79-74-65-5b-5d --> ce qui est en base. Voici le code pour récupérer la valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    command.CommandText = @"SELECT motDePasse
                            FROM useragenda";
    Reader = command.ExecuteReader();
     
    while (Reader.Read())
    {
          byte[] test = (byte[])Reader["motDePasse"];
          MessageBox.Show(System.BitConverter.ToString(test));
    }
    Mais si j'affiche la chaine du textbox convertie en UTF8 (celle que j'envoie dans le INSERT) j'obtiens: 74-65-73-74

    Comparons ces 2 résultats:
    Récupéré de la base: 53-79-73-74-65-6d-2e-42-79-74-65-5b-5d
    Chaine brute convertie: 74-65-73-74

    Je ne sais pas trop pourquoi mais je sens que ce n'est pas une coincidence et la fin est surement assez proche!

    En vous souhaitant une bonne soirée (nuit en fait...), et en vous remerciant d'avance!

    Tib!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    53-79-73-74-65-6d-2e-42-79-74-65-5b-5d, c'est la représentation en UTF-8 de "System.Byte[]". Donc a priori il y a un problème avec la façon dont tu insères les données en base : tu passes ton tableau de bytes à la BDD en tant que String et non en tant que byte[]... Poste ton code d'insertion ; je soupçonne que tu construis ta requête par concaténation, au lieu d'utiliser une requête paramétrée.

    D'autre part, on n'enregistre jamais un mot de passe en clair dans la base de données : on enregistre plutôt un hash (MD5 ou SHA1 par exemple).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut
    Pour l'insert je fais juste un INSERT INTO de passwordByte, (voir le code de mon message précédant). Sur SQLServer ça fonctionne parfaitement c'est ça que je comprend pas.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Tibà22 Voir le message
    Pour l'insert je fais juste un INSERT INTO de passwordByte, (voir le code de mon message précédant).
    Bah justement, dans ton message tu ne montres pas le code qui fait l'insertion... c'est bien pour ça que je te le demande

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 34
    Par défaut
    Voici le code que tu demandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string MotDePasse = txtbox_Mdp.Text;
     
    byte[] passwordbyte = System.Text.Encoding.UTF8.GetBytes(MotDePasse);
     
    string command = "INSERT INTO useragenda (motDePasse) values ('" + passwordbyte + "');";

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Oui, donc c'est bien ce que je disais... et ça m'étonnerait que ça fonctionne sous SQL Server.

    Avec ce code, la requête que tu génères est la suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO useragenda (motDePasse) values ('System.Byte[]');

    (la concaténation de passwordByte dans la requête revient à appeler passwordByte.ToString(), ce qui donne "System.Byte[]")

    Il ne faut pas construire les requêtes par concaténation. C'est déjà risqué pour les nombres, chaines ou dates, mais pour les tableaux d'octets ça ne peut pas marcher. Il faut utiliser des requêtes paramétrées, comme expliqué ici

Discussions similaires

  1. [Kylix] [cgi] pb déploiement appli avec connexion MySQL [rés
    Par Nepomiachty Olivier dans le forum EDI
    Réponses: 3
    Dernier message: 06/08/2002, 20h09
  2. Probleme C++Builder et Mysql
    Par noname dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 13h40
  3. connection a une BDD MySql
    Par delire8 dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2002, 18h18
  4. [Kylix] Pb connection à Mysql
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 25/04/2002, 15h26

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