codememo

오라클 번호부터 C# 십진수까지

tipmemo 2023. 10. 15. 17:24
반응형

오라클 번호부터 C# 십진수까지

인터넷에 이 문제와 관련된 여러 스레드와 게시물이 있다는 것을 알고 있으며 (모든 기사를 인정하지는 않지만) 읽었지만 어느 것도 저를 완전히 만족시키지 못했습니다.

내 상황:
ODP.net ( dll 버전 2.111.6.0)을 사용하여 Oracle DB(버전 10 + 11)에 액세스하고 DataReader를 사용하여 데이터(.)를 검색하고 있습니다.NET 3.5, C#).

이 코드를 사용하면 '시스템'이 됩니다.오버플로예외(산술 연산으로 오버플로가 발생했습니다.)'


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

그리고 이것은 '3,00000000000000000000000000000000000000000000E-126'의 값을 만듭니다.


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

이제 이 값을 제대로 검색하고 평가할 수 있는 방법을 찾아야 합니다. DB는 내가 통제할 수 없는 다른 앱에서도 사용되므로 변경할 수 없습니다.

내 C# 코드의 유형을 '십진법'에서 '더블'로 변환하는 것도 선택 사항이 아닙니다.

무슨 생각 있어요?

Oracle Decimal의 정밀도는 10진수보다 큽니다.그렇기 때문에 우선 정밀도를 줄여야 합니다.구문 분석은 모두 잊어버리고 암묵적 변환을 사용합니다.(검증되지 않은) 항목에 따라 시도해 보십시오.

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

방금 비슷한 문제가 있었는데 Oracle Data Adapter를 변경하여 Oracle 특정 유형(data_adapter)을 반환하는 접근 방식을 시도했습니다.ReturnProviderSpecificTypes = true;), 하지만 이는 단지 PITA일 뿐이며, 결국 Oracle Strings를 문자열 등으로 다시 캐스팅하게 됩니다.

결국 오라클의 라운드 함수를 사용하여 SQL 문에서 정밀 라운딩을 수행함으로써 해결했습니다.

SELECT round( myfield, 18 ) FROM mytable

그러면 닷넷은 수치를 십진법으로 행복하게 변환합니다.

언급URL : https://stackoverflow.com/questions/1906361/oracle-number-to-c-sharp-decimal

반응형