質問

私はこの問題について、いくつかのスレッドと投稿がインターネットである知っていると私はそれらを読んだ(すべての記事ではない、私は認めざるを得ない)それらのどれも完全に私を満たしていないでした。

私の状況:
私は、Oracle DB(バージョン10 + 11)と、データを取得するためのDataReader(.NET 3.5、C#)にアクセスするODP.net(DLLのバージョン2.111.6.0)を使用しています。

このコードの結果を使用して ' System.OverflowException(算術演算の結果がオーバフロー。)


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

の値でこれ結果 ' 3,000000000000000000000000000000000000000000000000000000000E-126


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

今、私が正しく、この値を取得し、評価するためにいくつかの方法を見つけなければならない - DBは、私のコントロール外にある他のアプリからも使用されているので、可能性がない変更

「ダブル」に「小数」からの私のC#のコード内の型を変換すると、実際にもオプションではありません。

任意のアイデア?

役に立ちましたか?

解決

私は同様の問題があったが、Oracleの特定のタイプ(data_adapter.ReturnProviderSpecificTypes =真を;)を返すようにOracleDataAdapterのを変えるのアプローチを試みたが、これは単に面倒くさされ、あなたはなど、バックの文字列にOracleStringsをキャスト終わります

最後に、私は、Oracleのラウンド関数を使用して、SQL文で丸め精度をすることによってそれを解決します:

SELECT round( myfield, 18 ) FROM mytable

DOTNETは、喜んで小数に数字を変換します。

他のヒント

のOracleDecimalは、小数よりも大きい精度を有しています。そのためには、最初の精度を削減する必要があります。すべての解析を忘れて、暗黙の型変換を使用します。 (未テスト)の線に沿って何かをしてみます:

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top