2009-12-15 11 views
8

Ich weiß, es gibt mehrere Themen und Beiträge zu diesem Thema im Internet und ich habe sie gelesen (nicht jeden Artikel, ich muss zugeben), aber keiner von ihnen hat mich voll befriedigt.Oracle-Nummer zu C# Dezimal

Meine Situation:
Ich verwende ODP.net (DLL Version 2.111.6.0), um die Oracle-DB (Version 10 + 11) und einem Datareader, um auf die Daten (.NET 3.5, C#) abzurufen.

mit diesem Code ergibt ein ' System.OverflowException (Arithmetic Operation führte zu einem Überlauf.)'


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

und dies resultiert in einem Wert von ' 3,000000000000000000000000000000000000000000000000000000000E-126'


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

Jetzt muss ich einen Weg finden, diesen Wert richtig abzurufen und zu bewerten - die DB auch von anderen Anwendungen verwendet wird, die aus meiner Kontrolle sind Änderungen sind also nicht möglich.

Konvertieren der Typen in meinem C# -Code von "Dezimal" zu "Doppel" ist auch nicht wirklich eine Option.

Irgendwelche Ideen?

Antwort

8

Ich hatte gerade ein ähnliches Problem und versucht, den Ansatz der OracleDataAdapter Ändern Oracle bestimmte Typen (data_adapter.ReturnProviderSpecificTypes = true;) zurück, aber das ist nur ein PITA, Sie am Ende OracleStrings zurück in Strings usw.

Am Ende habe ich es gelöst, indem Sie die Präzision Rundung in der SQL-Anweisung unter Verwendung von Oracle Rundenfunktion Gießen:

SELECT round(myfield, 18) FROM mytable 

Dotnet wird dann glücklich konvertieren die Figur zu einem de cimal.

+0

Hallo Dave, danke für den Hinweis! –

+1

Dies schlägt bei sehr großen Zahlen fehl – Stig

15

OracleDecimal hat eine größere Genauigkeit als Dezimal. Aus diesem Grund müssen Sie zuerst die Präzision reduzieren. Vergessen Sie das Parsen, verwenden Sie die implizite Konvertierung. Versuchen Sie, etwas entlang der Linien von (nicht getestet):

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

Ich hasse Oracle; Alle wollen nur ein reguläres Dezimalsystem, aber Oracle lässt uns durch die Ringe springen. – eschneider

+1

Danke, ich habe das als meine Lösung benutzt. Das erste Mal, dass ich mit dem Oracle-Provider zusammenarbeite, war kein angenehmer ... – Etch

+1

eschneider: Oracle hatte die größere Genauigkeit, bevor C# erfunden wurde, also müssen sie etwas tun, was es erlaubt, die volle Präzision der Datenbank zu nutzen. –