문제

나는 인터넷 에이 문제에 관한 몇 가지 스레드와 게시물이 있다는 것을 알고 있으며, 나는 그것들을 읽었습니다 (모든 기사는 아니고 인정해야합니다).

내 상황 :
Oracle DB (버전 10 + 11)와 데이터 리더에 액세스하기 위해 ODP.NET (DLL 버전 2.111.6.0)을 사용하여 데이터 (.NET 3.5, C#)에 액세스하고 있습니다.

이 코드를 사용하여 ''System.OverFlowException (산술 작동이 오버플로가 발생했습니다.)'


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

그리고 이것은 '의 가치를 초래합니다.3,000000000000000000000000000000000000000000000000000000000000000E-126'


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

이제이 값을 올바르게 검색하고 평가할 수있는 방법을 찾아야합니다. DB는 내 제어를 벗어난 다른 앱에서도 사용되므로 변경이 불가능합니다.

내 C# 코드의 유형을 'Decimal'에서 'double'으로 변환하는 것도 실제로 옵션이 아닙니다.

어떤 아이디어?

도움이 되었습니까?

해결책

방금 비슷한 문제가 있었고 OracledataAdapter를 변경하여 Oracle 특정 유형을 반환하기 위해 접근하려고 시도했습니다 (data_adapter.returnProviderspecifictypes = true;), 이것은 단지 pita 일 뿐이므로, 당신은 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