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 :

ajout champ en décimal dans table ACCESS


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 )

  2. #2
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    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 : 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
    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.
    Articles sur les technologies .NET

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

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    tout en laissant le type decimal dans la table?

  4. #4
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    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
    Articles sur les technologies .NET

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

    Votre problème est résolu ? utilisez le bouton

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    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

  6. #6
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    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.
    Articles sur les technologies .NET

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

    Votre problème est résolu ? utilisez le bouton

  7. #7
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    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 : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    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

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

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

    par cet exemple de code :

    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
     
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (!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

  9. #9
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    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 : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    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

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    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

  11. #11
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    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 : 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
    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();
       }
    }
    Articles sur les technologies .NET

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

    Votre problème est résolu ? utilisez le bouton

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Merci,

    Je teste cela en rentrant du boulot demain et je vous tiens au courant.

  13. #13
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    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 : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    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

  14. #14
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    OleDbType.Decimal supprime bien la décimale comme il a expliqué plus haut. Phénomène bizarre que je n'ai pas encore compris...
    Articles sur les technologies .NET

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

    Votre problème est résolu ? utilisez le bouton

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    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.

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/03/2015, 12h42
  2. Réponses: 10
    Dernier message: 10/08/2010, 14h29
  3. nombre de champ dans table access
    Par rec82 dans le forum Bases de données
    Réponses: 1
    Dernier message: 27/01/2009, 11h36
  4. Affectation sur un champ vide d'une table Access
    Par kurkaine dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/11/2005, 09h14
  5. Recherche valeur dans table Access
    Par Stefloulou dans le forum Access
    Réponses: 1
    Dernier message: 05/11/2005, 08h45

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