2009-12-15 50 views
8

Tôi biết có một số chủ đề và bài viết liên quan đến vấn đề này trên internet và tôi đã đọc chúng (không phải mọi bài viết, tôi phải thừa nhận) nhưng không ai trong số họ hoàn toàn thỏa mãn tôi.Số Oracle để C# số thập phân

Tình huống của tôi:
Tôi đang sử dụng ODP.net (phiên bản dll 2.111.6.0) để truy cập Oracle DB (phiên bản 10 + 11) và DataReader để truy xuất dữ liệu (.NET 3.5, C#).

Sử dụng mã này kết quả trong một ' System.OverflowException (hoạt động số học dẫn đến sự tràn.)'


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

và điều này một kết quả trong một giá trị của ' 3,000000000000000000000000000000000000000000000000000000000E-126'


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

Bây giờ tôi phải tìm một số cách để truy xuất và đánh giá giá trị này đúng cách - DB cũng được sử dụng từ các ứng dụng khác ngoài tầm kiểm soát của tôi vì vậy những thay đổi không thể thực hiện được.

Việc chuyển đổi các loại trong mã C# của tôi từ 'thập phân' thành 'gấp đôi' cũng không thực sự là một tùy chọn.

Bất kỳ ý tưởng nào?

Trả lời

8

Tôi chỉ có một vấn đề tương tự, và cố gắng tiếp cận của việc thay đổi OracleDataAdapter trở về Oracle loại cụ thể (data_adapter.ReturnProviderSpecificTypes = true;), nhưng đây chỉ là một Pita, bạn kết thúc đúc OracleStrings trở lại chuỗi vv

cuối cùng tôi giải quyết nó bằng cách làm chính xác làm tròn trong câu lệnh SQL sử dụng chức năng vòng Oracle:

SELECT round(myfield, 18) FROM mytable 

Dotnet thì hạnh phúc sẽ chuyển đổi con số để một de cimal.

+0

Xin chào Dave, cảm ơn vì gợi ý! –

+1

Điều này không thành công trên các số rất lớn – Stig

15

OracleDecimal có độ chính xác lớn hơn thập phân. Vì lý do đó, bạn phải giảm độ chính xác trước. Quên tất cả phân tích cú pháp, sử dụng chuyển đổi ngầm định. Hãy thử một cái gì đó dọc theo dòng (chưa được kiểm tra):

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

Tôi ghét Oracle; Vì vậy, tất cả mọi người chỉ muốn một Decimal thường xuyên, nhưng Oracle làm cho chúng ta nhảy qua hoops. – eschneider

+1

Cảm ơn, tôi đã sử dụng giải pháp này làm giải pháp của mình. Lần đầu tiên tôi làm việc với nhà cung cấp Oracle không phải là một điều thú vị .... – Etch

+1

eschneider: Oracle có mức độ ưu tiên lớn hơn trước khi C# được phát minh, vì vậy họ phải làm điều gì đó cho phép sử dụng đầy đủ độ chính xác mà cơ sở dữ liệu cung cấp. –

Các vấn đề liên quan