Oracle-Nummer C # dezimal
-
19-09-2019 - |
Frage
Ich weiß, gibt es mehrere Themen und Beiträge zu diesem Thema im Internet und ich habe gelesen, sie (nicht jeden Artikel, ich muß zugeben), aber keiner von ihnen hat mich voll erfüllen.
Meine Situation:
Ich verwende ODP.net (DLL-Version 2.111.6.0), um die Oracle-DB zugreifen (Version 10 + 11) und ein Datareader zum Abrufen der Daten (.NET 3.5, C #).
Mit diesem Code führt zu einem ' System.OverflowException (Rechenoperation in einem Überlauf geführt.)
decimal.TryParse(oraReader.GetOracleDecimal(0).Value.ToString(),
NumberStyles.Any, null, out parsedOraDecimal)
und dieser führt zu einem Wert von ' 3,000000000000000000000000000000000000000000000000000000000E-126
decimal.TryParse(oraReader.GetOracleValue(0).ToString(),
NumberStyles.Any, null, out parsedOraDecimal)
Jetzt muss ich einen Weg finden, abrufen und bewerten Sie diesen Wert richtig - die DB auch von anderen Anwendungen verwendet wird, die so meiner Kontrolle sind out ändert es nicht möglich
.Konvertierung der Typen in meinem C # -Code von ‚Dezimal‘ auf ‚double‘ ist auch nicht wirklich eine Option.
Irgendwelche Ideen?
Lösung
Ich hatte gerade ein ähnliches Problem und versuchte, den Ansatz der OracleDataAdapter Ändern Oracle spezifische Typen zurückzukehren (data_adapter.ReturnProviderSpecificTypes = true;), aber dies ist nur ein PITA, Sie OracleStrings zurück zu Strings am Ende Gießen usw.
Am Ende löse ich es durch die Präzision zu tun in der SQL-Anweisung Rundung unter Verwendung von Oracle Rundenfunktion:
SELECT round( myfield, 18 ) FROM mytable
Dotnet wird dann wandelt glücklich die Figur in eine Dezimalzahl.
Andere Tipps
OracleDecimal hat eine größere Genauigkeit als Dezimalzahl. Aus diesem Grund müssen Sie zunächst die Präzision verringern. Vergessen Sie all die Analyse verwenden implizite Konvertierung. Versuchen Sie, etwas entlang der Linien von (nicht getestet):
decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));