Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > C#
C# Forum d'entraide sur la programmation C#. Avant de poster -> FAQ C#, Articles C#, Sources C#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/01/2013, 13h34   #1
djmic
Nouveau Membre du Club
 
Inscription : février 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 109
Points : 27
Points : 27
Par défaut ajout champ en décimal dans table ACCESS

Bonjour,

je cherche désespérément à insérer un champs en décimal dans une table ACCESS, mais la valeur est formatée à l'insertion.

Code et Exemple:

Code :
commande.Parameters.Add(new OleDbParameter("@prix", Convert.ToDecimal(mtbPrix.Text)));
ma MaskedTextBox mtbPrix a un masque 9,99 ( j'ai essayé avec 9.99 ).

mon champ prix dans la table est défini comme ceci dans la table.

Taille du champ : Décimal
Précision : 18
échelle : 2
Décimales : 2

si j’essaie d'insérer 1,12 la valeur 112 est introduite dans la table.

Est-ce que c'est ACCESS qui formate la valeur? comment éviter cela?


Merci ( en espérant ne pas m'être trompé de forum )
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 22h12   #2
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 515
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 515
Points : 1 571
Points : 1 571
Bonjour,

J'ai recréer une DB avec une table reprenant un champ du même type que le votre. Effectivement j'ai reproduis l'erreur.

Le code suivant fonctionne :

Code :
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
 
_dbConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb");
 
try
{
   _dbConnection.Open();
 
   double dec = 9.99;
   OleDbCommand cmd = new OleDbCommand( "INSERT INTO TABLE1 (DECI) VALUES(@Val1)");
   cmd.Connection = _dbConnection;
   cmd.Parameters.Add("@Val1", OleDbType.Double).Value = dec;
 
   cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
   MessageBox.Show(ex.Message, "Erreur");
}
finally
{
   if (_dbConnection != null && _dbConnection.State == ConnectionState.Open)
   {
       _dbConnection.Close();
       _dbConnection.Dispose();
   }
}
Il semblerait qu'utiliser le type décimal en C# provoque le problème contrairement au typedouble.
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 23h36   #3
djmic
Nouveau Membre du Club
 
Inscription : février 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 109
Points : 27
Points : 27
Bonjour,

tout en laissant le type decimal dans la table?
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 00h57   #4
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 515
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 515
Points : 1 571
Points : 1 571
Bonsoir,

Je n'ai pas touché au schéma de la table, j'ai bien repris celui que vous avez spécifié dans votre post
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 16h29   #5
djmic
Nouveau Membre du Club
 
Inscription : février 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 109
Points : 27
Points : 27
Bonjour binou76,

Effectivement cela fonctionne.

J'avais antérieurement essayer de travailler avec des double, mais là c'est C# qui provoquait des problèmes de précisions au niveau de calculs.

Il faudrait donc que je trouve plutôt une solution pour travailler de nouveau avec des double alors
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 20h07   #6
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 515
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 515
Points : 1 571
Points : 1 571
Personnellement quand je travaille avec des nombres avec décimal j'utilise soit les float soit les doubles. Je n'ai jamais utilisé le type décimal.

Erreur ou non, je n'ai jamais eu de problème pour autant que les types utilisés soit les mêmes.

Maintenant d'autres membres du forum auront peut-être des explications plus concrètes sur d'éventuels avantages à utiliser le type décimal.
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 23h15   #7
sisqo60
Membre Expert
 
Avatar de sisqo60
 
Homme
Consultant informatique
Inscription : février 2006
Messages : 727
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : février 2006
Messages : 727
Points : 1 138
Points : 1 138
Bonjour,

Quant au choix decimal ou double, on ne peut pas te donner une réponse, il faut que tu choisisses le type qui correspond le plus à tes besoins. Deux liens intéressants Lien1 et Lien2.

A toi de voir
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

N'oubliez pas de avant de
Pas de question techniques par MP, c'est contre la philosophie du forum
sisqo60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 11h24   #8
djmic
Nouveau Membre du Club
 
Inscription : février 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 109
Points : 27
Points : 27
Bonjour,

J'ai toujours travaillé avec des double aussi, mais cette fois-ci j'ai des soucis.

par cet exemple de code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
double montTotal = 0;
 
for (int i = 0; i < 6; i++) 
{
     if (!labelMontant[i].Text.Equals(""))
    {
        montTotal = montTotal + 
                         Convert.ToDouble(labelMontant[i].Text.Substring(0, 
                         labelMontant[i].Text.Length - 2));
    }
}
 
 
double reste = Convert.ToDouble(lbMontant.Text.Substring(0, 
                    lbMontant.Text.Length - 2));
 
label4.Text = Convert.ToString(reste - montTotal);
Seulement les trois premiers éléments sont considérés par la condition suivante:
Code :
(!labelMontant[i].Text.Equals(""))
ce que j'obtiens après la boucle :
montTotal = 579.99 // ce qui est normal
reste = 580.00

mais à l'opération reste - montTotal, je n'obtiens pas 0, 01 mais 0,00999999999999091.

Une idée de ce que ça peut être?

Merci
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 18h34   #9
sisqo60
Membre Expert
 
Avatar de sisqo60
 
Homme
Consultant informatique
Inscription : février 2006
Messages : 727
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : février 2006
Messages : 727
Points : 1 138
Points : 1 138
avec des decimal tu aurais une meilleure précision

Reprend tes cours sur la représentation binaire des nombres et fais le calul, tu verras que ça peut être normal
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

N'oubliez pas de avant de
Pas de question techniques par MP, c'est contre la philosophie du forum
sisqo60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 19h06   #10
djmic
Nouveau Membre du Club
 
Inscription : février 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 109
Points : 27
Points : 27
Bonjour sisqo60,

Oui, c'est ce qui me pose problème ( le problème initial du post )

le décimal est plus précis, mais il me pose problème quand je dois le stocker dans la base de données
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 22h51   #11
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 515
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 515
Points : 1 571
Points : 1 571
Bonjour je pense que j'ai la solution à votre problème.

J'ai gardé le même schéma pour votre table.

J'utilise le Type "Décimal" pour les différents calculs pour corriger votre problème causé par manque de précision du Type Double. je spécifie juste "OleDbType.Double" comme type lors de la création du paramètre pour la sauvegarde et la valeur est sauvée correctement dans la table. Et lors de la récupération je récupère bien la bonne valeur dans une variable de type "Decimal". Voici le code que j'ai écris comme test (ne faite pas attention à l'Id qui est harcodé c'est pas propre mais c’était pour gagner un peu de temps).

Code :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
_dbConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb");
 
try
{
   _dbConnection.Open();
 
   decimal montTotal = (decimal)578.98; 
   decimal reste =  (decimal)580.00 ;
 
   decimal result = reste - montTotal;
 
   // Sauvegarde dans la db
   OleDbCommand cmd = new OleDbCommand("INSERT INTO TABLE1 (ID,DECI) VALUES(2,@Val1)");
   cmd.Connection = _dbConnection;
   cmd.Parameters.Add("@Val1", OleDbType.Double).Value = result;
 
   cmd.ExecuteNonQuery();
 
   // Récupération dans la db 
   cmd.CommandText = "SELECT * FROM TABLE1 WHERE ID = 2";
 
   OleDbDataReader dr = cmd.ExecuteReader();
 
   if (dr.Read())
   {
      result = dr.GetDecimal(1);
   }
 
   dr.Close();                 
}
catch (Exception ex)
{
   MessageBox.Show(ex.Message, "Erreur");
}
finally
{
   if (_dbConnection != null && _dbConnection.State == ConnectionState.Open)
   {
      _dbConnection.Close();
      _dbConnection.Dispose();
   }
}
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 23h05   #12
djmic
Nouveau Membre du Club
 
Inscription : février 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 109
Points : 27
Points : 27
Merci,

Je teste cela en rentrant du boulot demain et je vous tiens au courant.
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 08h33   #13
sisqo60
Membre Expert
 
Avatar de sisqo60
 
Homme
Consultant informatique
Inscription : février 2006
Messages : 727
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : février 2006
Messages : 727
Points : 1 138
Points : 1 138
Bonjour,

Il y a OleDbType.Decimal et OleDbType.Numeric qui te permettrons de mieux stocker tes données en base. J'ai bien peur qu'enregistrer un decimal en type double te donnes (pas toujours, ça dépend de la précision) des valeurs différentes base.

Si ton champ en base de données est un Numeric (18, 2), utilises numeric
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

N'oubliez pas de avant de
Pas de question techniques par MP, c'est contre la philosophie du forum
sisqo60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 15h22   #14
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 515
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 515
Points : 1 571
Points : 1 571
OleDbType.Decimal supprime bien la décimale comme il a expliqué plus haut. Phénomène bizarre que je n'ai pas encore compris...
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 15h27   #15
djmic
Nouveau Membre du Club
 
Inscription : février 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 109
Points : 27
Points : 27
Salut,

Merci binou76, ca fonctionne très bien et je suis enfin sorti de ce cercle vicieux.

Effectivement sisqo60, OleDbType.Decimal me supprime la virgule ( ou point ) lors de l'insertion.
J'ai donc essayé de travailler avec des double, où là j'avais des problèmes de précisions.

Donc la solution de binou76 fonctionne à merveille et me permet de travailler avec des Decimal et de pouvoir les introduire en DB.
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h22.


 
 
 
 
Partenaires

Hébergement Web