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 :

DataSet - L'opération arithmétique a provoqué un dépassement de capacité


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Points : 48
    Points
    48
    Par défaut DataSet - L'opération arithmétique a provoqué un dépassement de capacité
    Bonjour,

    Voici le genre de nombre stockés dans une base de données que je tente de récupérer via un DataSet :

    1.21162790697674418604651162790697674419E01
    1.22195121951219512195121951219512195122E01
    1.20454545454545454545454545454545454546E01
    Que je passe par un DataReader reader => reader.Read()
    ou alors par un DataSet => Oadapter.Fill(Odsdata)

    j'obtiens l'erreur suivante :
    L'opération arithmétique a provoqué un dépassement de capacité.
    Quelqu'un aurait-il une solution?

    Merci.

  2. #2
    Membre averti

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 379
    Points
    379
    Par défaut
    1.21162790697674418604651162790697674419E01
    Retour en notion de mathématique : 1.211E01 = 1.211 x 10 puissance 1, c'est à dire 1.211 ?

    1. Dans quel type ce champ est stocké dans ta BD (DOUBLE, DECIMAL) ?
    2. Dans quel type C# ta variable sera-t-elle stocké (float, double) ?

    Également il est important de savoir qu'une précision de seulement 15 à 16 chiffre après la virgule est possible via un double. Sinon je crois qu'il faut préférer decimal.
    ______________
    Never underestimated the browser
    Ne jamais sous-estimé le navigateur
    Vic Gundotra, Google IO 2009

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    J'ai le message d'erreur lors de la récupération, donc si c'est avec un DataSet, le message d'erreur survient à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Oadapter.Fill(Odsdata);
    Donc ici je n'essaie même pas de la stocker dans un float ou un autre type.

    Si j'utilise un DataReader, elle survient à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float num = float.Parse(Odata[6].ToString());
    Cette valeur est stockée dans une BD Oracle, dans un champs de type NUMBER.

    Merci.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    Une piste serait de savoir comment sont créées ces valeurs. Par un programme C# ? Si oui, alors essaye d'avoir le code les manipulant. Ca te simplifiera la récupération.

    Sinon quand tu fais la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float num = float.Parse(Odata[6].ToString());
    Essaye plutôt de récupérer un object. D'ailleurs quel est le type via un espion de Odata[6].

    Sinon il me semble qu'il existait dans la MSDN un tableau de correspondance entre type C# et type Oracle mais pas moyen de le retrouver.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    J'ai même essayé ceci pour ne pas passer par le .ToString() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Decimal num = Convert.ToDecimal(Odata[6]);
    J'obtiens la même erreur.

    Lorsque je compile sans le mode debug, je vois dans ma console :

    Exception non gérée : System.OverflowException: L'opérateur arithmétique a provoqué un dépassement de capacité
    à Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx)
    à Oracle.DataAccess.Client.OracleDataReader.GetDecimal(Int32 i)
    à Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)
    à Oracle.DataAccess.Client.OracleDataReader.Get_Item(Int32 i)
    à replication_Oracle_MySql.Program.Main(String[] args) dans C:\...\Prgram.cs:ligne 437
    La ligne 437 étant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Decimal num = Convert.ToDecimal(Odata[6]);

    Si j'essaie d'afficher directement l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine("La valeur est : \n " + Odata[6]);
    J'obtiens la même erreur m'indiquant cette ligne.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Et sinon quel est le type de Odata[6] ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Odata est un DbDataReader.

    Voici une partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Orequete = "SELECT " + Orequete + " FROM " + Odstname.Tables[0].Rows[i]["tname"];
     
    DbConnection Oco = dbo.Oco();
     
    DbCommand cmdrecupdata = dbo.Command(Orequete, Oco);
    DbDataReader Odata = dbo.ExecuteQuery(cmdrecupdata);
     
    while (Odata.Read())
    {
                  Decimal num = Convert.ToDecimal(Odata[6]); 
    }

  8. #8
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Decimal num = Convert.ToDecimal(Odata[6]);
    Fait :
    Et regardes le type de num, quel est-il ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Points : 48
    Points
    48
    Par défaut
    Je pense que le problème venait du fait que dans Oracle, il n'y avait pas de taille donnée pour cette colonne. La colonne était de type NUMBER mais aucune taille n'était définie.

    Vu que je n'ai accès qu'en lecture à cette BD, j'ai bypassé ce problème en détectant tout d'abord si j'avais une colonne de type NUMBER dans mon schéma de table, et ensuite si sa taille était de 0, je remplaçais :

    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CAST (monchamps as NUMBER(10,4))...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 17/10/2014, 16h08
  2. Réponses: 1
    Dernier message: 02/11/2011, 17h18
  3. Réponses: 8
    Dernier message: 06/09/2011, 16h23
  4. Réponses: 1
    Dernier message: 22/12/2007, 15h14
  5. [VAL] Opérations arithmétiques
    Par WriteLN dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/05/2005, 09h59

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