2009-12-15 24 views
8

Je sais qu'il ya plusieurs sujets et messages concernant ce problème sur Internet et je les ai lus (pas tous les articles, je dois admettre) mais aucun d'entre eux ne m'a entièrement satisfait.Oracle nombre à C# décimal

Ma situation:
J'utilise ODP.net (version dll 2.111.6.0) pour accéder à la base de données Oracle (version 10 + 11) et un DataReader pour récupérer les données (.NET 3.5, C#).

L'utilisation de ce code entraîne une ' System.OverflowException (opération arithmétique a donné lieu à un dépassement de capacité.)'


decimal.TryParse(oraReader.GetOracleDecimal(0).Value.ToString(), 
    NumberStyles.Any, null, out parsedOraDecimal) 

et celui-ci se traduit par une valeur de ' 3,000000000000000000000000000000000000000000000000000000000E-126'


decimal.TryParse(oraReader.GetOracleValue(0).ToString(), 
    NumberStyles.Any, null, out parsedOraDecimal) 

maintenant, je dois trouver un moyen de récupérer et d'évaluer correctement cette valeur - la DB est également utilisé d'autres applications qui sont hors de mon contrôle donc les changements ne sont pas possibles.

La conversion des types dans mon code C# de 'decimal' en 'double' n'est pas vraiment une option.

Des idées?

Répondre

8

Je viens d'avoir un problème similaire, et essayé l'approche du changement de OracleDataAdapter revenir types spécifiques Oracle (data_adapter.ReturnProviderSpecificTypes = true;), mais cela est juste un PITA, vous finissez par coulée OracleStrings dos aux cordes, etc.

en fin de compte je l'ai résolu en faisant la précision d'arrondi dans l'instruction SQL en utilisant la fonction tour d'Oracle:

SELECT round(myfield, 18) FROM mytable 

Dotnet convertira ensuite joyeusement la figure à un de cimal.

+0

Salut Dave, merci pour l'indice! –

+1

Cela échoue sur les très grands nombres – Stig

15

OracleDecimal a une précision supérieure à la décimale. Pour cette raison, vous devez d'abord réduire la précision. Oubliez toute l'analyse, utilisez la conversion implicite. Essayez quelque chose le long des lignes de (non testé):

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28)); 
+4

Je déteste Oracle; Donc, tout le monde veut juste une décimale régulière, mais Oracle nous fait sauter dans les cerceaux. – eschneider

+1

Merci, j'ai utilisé ceci comme ma solution. La première fois que j'ai travaillé avec le fournisseur Oracle, ça n'a pas été agréable ... – Etch

+1

eschneider: Oracle avait la plus grande précision avant que C# ne soit inventé, donc ils doivent faire quelque chose qui permet d'utiliser toute la précision de la base de données. –