programing

ODP.net 데이터 집합 채우기 시 Oracle Decimal Number 정밀도 문제.예외:산술 연산으로 오버플로가 발생했습니다.

mailnote 2023. 11. 2. 22:00
반응형

ODP.net 데이터 집합 채우기 시 Oracle Decimal Number 정밀도 문제.예외:산술 연산으로 오버플로가 발생했습니다.

저는 c# .net 2(Visual Studio 2005 SP1)에서 Oracle 10g 데이터베이스의 select * 테이블에서 데이터 세트를 채우려고 시도하고 있습니다.이 클라이언트 사이트에서는 .net 프레임워크, IDE 및 데이터베이스를 변경할 수 없습니다.

ODP.net 공급자를 사용하여 dll 버전이 2.102.2.20입니다.

fill 명령을 실행하면 Exception:

산술 연산으로 오버플로가 발생했습니다.

또한 Visual Studio designer(테이블 데이터 표시)에서 문제가 되는 열을 보려고 하면 테이블의 이 열에 대한 모든 행에 대해 얻게 됩니다.쿼리가 정수가 있는 다른 열을 선택하는 경우(예: 이 열을 생략하는 경우) 코드가 완벽하게 작동합니다.

Toad에서 데이터베이스로 볼 때 해당 열은 문제가 없어 보입니다. 데이터는 다음과 같습니다.

919.742866695572

몬테카를로 시뮬레이션에 필요한 정밀도가 필요합니다.

데이터 어댑터를 사용하여 데이터 테이블을 채우는 대신 데이터 리더를 사용하고 dataReader.getValue(열)를 호출합니다.색인) 동일한 오류가 발생하지만 dataReader를 호출하면 오류가 발생합니다.오라클 십진수 가져오기(열)Index) 그러면 원하는 결과가 나옵니다. 오류가 없습니다.

데이터 어댑터를 사용하여 데이터셋을 채우고 싶습니다(오라클 DB에서 작동할 강력한 유형의 데이터셋을 자동 생성할 수 없었기 때문에 이 데이터셋은 유형이 없는 데이터셋입니다).데이터 유형별로 특정 수신 호출이 필요한 열 수, 십진 열 인덱스에 관계없이 많은 시나리오에 대해 작업할 수 있는 일반적인 방법으로 데이터 리더를 사용하고 결과(열 값 선택)를 훑어보고 싶지 않습니다.

누가 도와줄 수 있습니까?ODP.net dll의 새 버전을 사용하여 이전 Oracle 10g 데이터베이스에 연결할 수 있습니까?이게 도움이 될지 궁금합니다.

감사해요.

문제는 결과 값의 정밀도가 너무 높아서 시스템으로 변환할 수 없다는 것입니다.데이터 손실이 없는 십진법입니다.정확한 숫자는 잊어버렸는데, 18자리 정도입니다.결과 값을 그 숫자로 반올림해도 됩니까?당신이 준 예에서, a.round(MyColumn, 15)아니면 그 정도면 충분할 겁니다...

최신 버전의 ODP를 사용해 볼 수 있습니다.그물 (11g).역호환성입니다.저는 그것을 10g 데이터베이스에 연결하는 데 사용합니다.저는 VS 2005와도 잘 어울려야 한다고 생각합니다.clickonce 배포의 경우 다음 질문에서 참조하는 dll을 추가하면 됩니다.C#를 Oracle 데이터베이스에 연결하는 데 필요한 최소 클라이언트 설치 공간은 얼마입니까?중요한 사항은 odp.net 의 최신 버전이 있는 경우 설치 디렉토리에 모든 dll이 포함된다는 것입니다.인스턴트 클라이언트를 따로 다운로드할 필요가 없습니다.그냥 검색해보세요.

상위 버전의 ODP로 이동하는 경우.NET도 12.x와 마찬가지로 오류가 "Armetic overflow"에서 "Invalid Cast Exception"으로 바뀝니다.소수점 2~4개 정도의 실용성을 높이기 위해 소수점 29자리 또는 30자리와 같은 미친 정밀도 값을 줄이기 위해 숫자 값을 캐스트해야 합니다.

10진수 값이 지나치게 큰 열과 행을 식별하려면 MY_SCHEMA, MY_TABLE 및 숫자 10을 say 25로 대체하여 소수점 25자리 이상의 값을 가지는 열을 식별한 후 아래 SQL을 실행할 수 있습니다.이 SQL은 문제 열을 식별하기 위해 실행해야 하는 SQL을 생성합니다.

SELECT 'SELECT ' || LISTAGG('MAX(LENGTH(TO_CHAR(ABS(' || column_name || ') - FLOOR(ABS(' || column_name || '))))) - 1  AS decimals_' || column_name || CHR(13)
                    , CHR(9)|| ', ') WITHIN GROUP (ORDER BY rn)  ||
                    ' FROM ' || owner || '.' || table_name  || CHR(13) ||
                    ' WHERE '  || CHR(13) ||
                      LISTAGG('(LENGTH(TO_CHAR(ABS(' || column_name || ') - FLOOR(ABS(' || column_name || ')))) - 1) > 10 ' || CHR(13)
                                , CHR(9)|| '  OR  ')
WITHIN GROUP (ORDER BY rn) AS Nasty_Numbers_Finder_Query
FROM
(
    SELECT  owner, table_name, column_name,
        row_number() OVER ( PARTITION BY table_name  ORDER BY rownum) rn
    FROM  dba_tab_columns
    WHERE
        OWNER = 'MY_SCHEMA'
        AND table_name = 'MY_TABLE'
        AND (data_type LIKE '%FLOAT%'
            OR data_type LIKE '%NUMERIC%')
) a
GROUP BY owner, table_name

더 많은 정보를 얻고자 여기 블로그에 글을 올렸습니다.

언급URL : https://stackoverflow.com/questions/1043626/odp-net-oracle-decimal-number-precision-problem-when-filling-a-dataset-exceptio

반응형