Saisir nombre à virgule dans une base de données

Fermé
Bobby - Modifié le 29 avril 2017 à 23:14
 Bobby - 16 mai 2017 à 16:23
Bonjour,

J'ai réalisé une application en C# dans laquelle on peut enregistrer de nouveaux produits dans la base de données (nom et prix). Sauf que j'ai un problème pour la saisie du prix.

requête SQL dans la classe Produit_DB :
public static void ajouterUnProduit(string nom, float prix)
        {
            try
            {
                MySqlCommand sql = Form1.objetConnexion.getConnexion().CreateCommand();
                sql.CommandText = "INSERT INTO produit VALUES (NULL, '" + nom+ "', " + prix + ")"; // id, nom, prix
                sql.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }


Pour la récupération des champs saisis :
string nom = textBoxNom.Text;
float prix = float.Parse(textBoxPrix.Text);

//appel de la requête SQL qui est dans la classe Produit_DB
Produit_DB.ajouterUnProduit(nom, prix);


La classe Produit :
 public class Produit
    {
        private int id;
        private string nom;
        private float prix;

        public Produit(int id, string nom, float prix) // le constructeur
{
            this.id= id;
            this.nom= nom;
            this.prix= prix;
}
}


J'ai fait un test avec comme nom "test" et comme prix "19.90".
Ma requête ressemble à : "INSERT INTO produit VALUES (NULL, 'test', 19.90);"
Sauf que j'ai une erreur disant "le format de la chaîne est incorrect". Le pire c'est que j'ai fait un copier-coller de cette requête directement dans la base de données et elle a fonctionné.

J'ai essayé avec "19,90" mais je sais pourquoi ça ne marche pas (à cause de la virgule et pas du point). J'ai aussi essayé de dire que le prix était de type decimal, float et double et rien n'a fonctionné.

J'espère que c'était clair et que vous pourriez m'aider sinon faites le moi savoir.

Bobby

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

4 réponses

Utilisateur anonyme
29 avril 2017 à 23:48
Bonjour

Pourquoi dis-tu "Ma requête ressemble à" et non pas "Ma requête est" ?
As-tu affiché ta requête réelle, ou est-ce seulement que tu crois que la requête est celle-ci parce que tu le déduis des valeurs que tu utilises pour nom et prix ? Je me méfie particulièrement des flottants qui, n'ayant la plupart du temps pas de représentation exacte, ne sont pas toujours ce qu'on croit.
0
NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024 345
30 avril 2017 à 00:25
Dans le texte :
Ma requête ressemble à : "INSERT INTO produit VALUES (NULL, 'test', 19.90);"

Je doute fortement, car quand tu converti un flottant en string, il retire les 0 inutiles.
En plus, le
... + prix + ...
.Net refuse de convertir implicitement les flottant en string.
0
J'ai utilisé une MessageBox pour voir à quoi ressemblait la requête après la saisie, j'ai fait un copier-coller de la MessageBox et je l'ai testée directement dans la base de données et ça a marché.

Même si les 0 inutiles sont retirés, il devrait au moins avoir la valeur "19.9" dans la base de données.

Ce que je comprends pas c'est que quand je saisis un nombre rond comme 20, la requête fonctionne et c'est dès qu'il y a le point que ça ne marche plus
0
Utilisateur anonyme
30 avril 2017 à 19:29
Pour débuger on ne se sert pas d'une MessageBox, on met un point d'arrêt et on espionne les variables.
0
Utilisateur anonyme
30 avril 2017 à 16:42
Je serais curieux de savoir comment tu as fait pour faire la requête dans une MessageBox. C'était bien à l'intérieur de la fonction ajouterUnProduit ?
Quand j'essaye ton code, la conversion faite par C# me donne 19,9 avec une virgule et sans 0.

J'ai installé C# - que je en connais pas - et fait quelques essai. J'ai réussi à obtenir ton message d'erreur, mais pas du tout à ce niveau-ci du code. C'est en convertissant le prix- lu comme une chaîne de caractères - en un float que ce message apparaît, si on met un . dans le nombre au lieu d'une ,.
Car à l'intérieur de ta fonction ajouterUnProduit, ce n'est pas toi qui choisis de mettre une virgule ou un point dans prix : c'est un float et c'est C# qui décide du séparateur qu'il utilise.
0
Bonsoir le père,

plus précisément dans le code source le symbole décimal est le point.
Mais lors de la conversion de string vers float, par défaut c'est la configuration du PC qui compte, donc si tu as la virgule comme symbole décimal, C# ne saura pas convertir ce texte en flaot (enfin pas directement), par contre si tu as le point comme symbole décimal ça marchera.

La solution qui marche dans une majorité de cas sans se poser de question (sauf si le string utilise la virgule comme séparateur de millier...) et de replacer la virgule par le point (si y'en a pas il ne se passe rien) et ensuite forcer C# à convertir en mode "comme dans le code".

            double val = Convert.ToDouble("19,90".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture);
            double val2 = Convert.ToDouble("19.90".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture);


Pour SQL, je ne sais pas je ne connais pas
0
i > Utilisateur anonyme
1 mai 2017 à 15:06
Pour faire apparaître la requête dans une MessageBox j'ai fait :
MessageBox.Show(sql.CommandText.ToString());


J'ai essayé en utilisant Convert.ToDouble et Replace sauf que ça marche pas non plus.
Quand je fais
Replace(",", ".")
et que je saisis "19.90", ça devient "19,90". Si je saisis "19,90" la valeur reste inchangée.
Si j'inverse et je fais
Replace(".", ",")
et que je saisis "19.90" ou "19,90" il ça devient "1990".
Si je tente des folies en essayant
Replace(".", ".")
avec comme saisie "19.90" ça devient "19,90". Et si je saisis "19,90", ça devient "1990".
Et j'ai quand même essayé
Replace(",", ",")
avec comme saisie "19.90", la valeur devient "19,90". Si je saisis "19,90", la valeur devient "1990".

Voilà je sais pas trop quoi faire j'ai essayé tout ce qui était possible et inimaginable
0
NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024 345
1 mai 2017 à 17:14
Serait-il possible de voir ton code de test ?
Le comportement que tu indique de Replace me semble très étrange.
0
Bobby > NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024
16 mai 2017 à 16:23
Voici le code qui récupère la valeur du prix :
double prix = Convert.ToDouble(textBoxPrix.Text.Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture);
0
Utilisateur anonyme
1 mai 2017 à 17:30
Tu mélanges tout, les strings, les nombres (float ou double) et le code.


Dans le code, que tu écris, pas ce qui s'éxécute réellement, un nombre décimal s'écrit toujours avec un point et sans séparateur de milliers
double nombre = 19.90;
si tu mets une virgule ça plante

Pour l'ordinateur, dans un float ou un double, le symbole décimal n'existent pas. Dans sa mémoire, ça n'est pas stocké 19.90, mais 33 33 9F 41Hex pour un float et 66 66 66 66 66 E6 33 40Hex pour un double.

Par contre comme, nous, "pauvres humains" ne sommes pas capables de calculer de tête une mantisse * 2 puissance exposant le tout écrit en héxadécimal, le déboggueur a la gentillesse de nous montrer un représentation du nombre au format du code (toujours le point et pas de séparateur de milliers)

Enfin ToString retourne une représentation du nombre en string qui dépend de la configuration de ton pc
double nombre = 1999.9;
string texte = nombre.ToString()

texte vaudra "1999,9" ou "1 999,9" ou "1,999.9" ou "1999.9" etc selon la configuration de ton PC


Maintenant si au lieu de continuer avec ta messageBox, tu faisais un vrai débogage en mode pas à pas avec des espions, tu pourrais voir quelque chose comme ça


Les 2 string de départ sont bien convertis en double
  • "19,90" => 19.9
  • "19.9" => 19.9

Et ensuite les 2 string sont les mêmes, puisque c'est le même nombre et que la config de mon PC n'a pas changé entre les 2 lignes.

Donc tu peux vérifier en pas à pas que la conversion fonctionne (mais cela aurait planté sinon...).

Maintenant, je le répète, pour ta requête SQL, je n'ai pas d'avis je n'en fais pas de sql.
0