2009-12-15 41 views
8

我知道有關於這個問題在互聯網上有幾個線程和帖子,我讀過他們(不是每篇文章,我不得不承認),但沒有一個完全滿足我。我正在使用ODP.net(dll版本2.111.6.0)訪問Oracle數據庫(版本10 + 11)和DataReader來檢索數據(.NET 3.5,C#)。我使用ODP.net(dll版本2.111.6.0)訪問Oracle數據庫(版本10 + 11)甲骨文號碼C#十進制

使用在此代碼的結果 ' 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#代碼中的類型從'decimal'轉換爲'double'也不是真正的選項。

任何想法?

回答

8

我剛做了一個類似的問題,並試圖改變OracleDataAdapter返回甲骨文特定類型(data_adapter.ReturnProviderSpecificTypes =真;)的方法,但是這僅僅是皮塔餅,你最終鑄造OracleStrings回字符串等

在我做使用Oracle的功能全面的精度在SQL語句四捨五入解決它的結束:然後

SELECT round(myfield, 18) FROM mytable 

DOTNET可以轉化該數字爲德cimal。

+0

嗨戴夫, 感謝您的提示! – 2010-03-11 13:43:48

+1

這在很大數字上失敗 – Stig 2016-10-07 06:52:53

15

OracleDecimal的精度比小數大。出於這個原因,你必須首先降低精度。忘掉所有的解析,使用隱式轉換。試一下沿(未經測試)的線路:

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

我討厭Oracle;所以每個人都想要一個正常的Decimal,但是Oracle讓我們跳過了一圈。 – eschneider 2012-11-30 15:53:19

+1

謝謝,我用這個作爲我的解決方案。我第一次與Oracle供應商合作並不是一件愉快的事情...... – Etch 2013-02-08 14:24:29

+1

eschneider:甲骨文在C#發明之前已經做了大量的準備工作,所以他們必須做一些事情來允許使用數據庫提供的全部精度。 – 2013-02-13 21:59:20