2009-12-15 12 views
8

İnternette bu konuyla ilgili birkaç konu ve mesaj bulunduğunu biliyorum ve bunları okudum (her makalede değil, itiraf etmeliyim) ama hiçbiri beni tam olarak tatmin etmedi.Oracle numarası C# ondalık

Benim durumum:
ben (sürüm 10 + 11) ve veri (.NET 3.5, C#) almak için bir DataReader Oracle DB erişmek için ODP.net (dll sürümünü 2.111.6.0) kullanıyorum.

bir bu kod sonuçları kullanarak


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

' System.OverflowException (Aritmetik işlem. Taşma ile sonuçlanmıştır)' ve ' 3,000000000000000000000000000000000000000000000000000000000E-126' değerine de bu sonuç


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

Şimdi bu değeri uygun almak ve değerlendirmek için bir yol bulmak zorunda - DB de benim kontrolüm dışında olan diğer uygulamalardan kullanılır bu yüzden değişiklikler mümkün değildir.

C# kodumdaki türleri "ondalık" dan "çift" e çevirmek de gerçekten bir seçenek değil.

Herhangi bir fikrin var mı?

cevap

8

Sadece benzer bir sorunu vardı ve Oracle belirli türleri (data_adapter.ReturnProviderSpecificTypes = true;) dönmek için OracleDataAdapter değişen yaklaşım denedi, ama bu sadece bağlıdır: (denenmemiş) çizgisinde bir şey deneyin

SELECT round(myfield, 18) FROM mytable 

Dotnet sonra mutlu dönüştürür: bir PİDE, ne Oracle'ın yuvarlak işlevini kullanarak SQL deyiminde yuvarlama hassas yaparak çözdü sonunda sırt, vb dizelerine

OracleStrings döküm sonunda de bir rakam cimal.

+0

Merhaba Dave, ipucu için teşekkürler! –

+1

Bu çok büyük sayılarda başarısız oluyor – Stig

15

OracleDecimal, ondalıktan daha büyük bir duyarlığa sahiptir. Bu nedenle, önce hassasiyeti azaltmanız gerekir. Tüm ayrıştırmaları unutun, örtülü dönüşüm kullanın.

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

Oracle'dan nefret ediyorum; Yani herkes sadece düzenli bir ondalık istiyor, ancak Oracle bizi çemberler üzerinden atlatıyor. – eschneider

+1

Teşekkürler, bunu benim çözümüm olarak kullandım. Oracle sağlayıcımla ilk kez çalışmam çok hoş bir şey değildi .... – Etch

+1

eschneider: Oracle, C# 'nin icat edilmesinden önce daha büyük bir öneme sahipti, bu yüzden veritabanının sunabileceği tam hassasiyetin kullanılmasına izin veren bir şeyler yapmak zorundalar. –