2017-11-27 15 views
1

지금까지는 Microsoft의 사용되지 않는 System.Data.OracleClient 드라이버와 함께 꽤 잘 작동하는 레거시 애플리케이션이 있습니다. C# 부울 값은 일반적으로 Oracle 데이터베이스에서 Number (5,0)로 표시됩니다. 수년 동안 이것은 아주 평온하게 일했습니다.오라클의 Managed ODP.Net을 사용하여 부울을 처리하는 방법

이제 Oracle의 Managed ODP.Net 교체로 마이그레이션하려고 시도하고 있으며, 부울은 특히 까다로운 것으로 입증되었습니다. Microsoft 드라이버를 Oracle ODP.Net nuget 패키지로 대체 한 결과, "insert .. where mybooleancolumn = true"(또는 매개 변수가있는 equivalents)와 같은 'sql'과 같은 쓰기 작업은 '정의되지 않은 데이터 유형'예외를 throw하고 부울 값을 읽는 것으로 나타났습니다. 데이터베이스 ("Select mybooleancolumn from ....")는 값이 C# 부울에 할당 될 때 모든 종류의 오류를 제공합니다.

다른 사람들이 어떻게이 문제를 극복합니까? 할 필요가있는 추가 매핑이 있습니까?

답변

1

(Oracle의 Managed ODP.NET을 사용하여) 연결하는 Oracle 데이터베이스에서 부울 값은 NUMBER (1, 0)로 표시됩니다.

<oracle.manageddataaccess.client> 
    <version number="*"> 
     <edmMappings> 
     <edmNumberMapping> 
      <add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number" /> 
      <add NETType="byte" MinPrecision="2" MaxPrecision="2" DBType="Number" /> 
      <add NETType="int16" MinPrecision="3" MaxPrecision="4" DBType="Number" /> 
      <add NETType="int32" MinPrecision="5" MaxPrecision="9" DBType="Number" /> 
      <add NETType="int64" MinPrecision="10" MaxPrecision="19" DBType="Number" /> 
     </edmNumberMapping> 
     </edmMappings> 

     <settings> 
     <setting name="TNS_ADMIN" value="PATH TO TNS_ADMIN" /> 
     </settings> 
    </version> 
    </oracle.manageddataaccess.client> 

중요한 비트는 다음과 같습니다 :

<add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number" /> 

당신이 그것을해야 이러한 매핑을 정의하면 다음

이 매핑이 제대로 작동 할 수 있도록 내 Web.config의 올바른 매핑 코드 작업.

EDIT : edmx 모델을 새로 고치고 (변경하지 않고 업데이트) 잊지 말고 응용 프로그램을 다시 작성하여 새 매핑을 사용하여 업데이트되었는지 확인하십시오.

+0

불행히도 그 차이는 없습니다. Managed ODP.Net을 사용하고 있습니다. 12.2.1100 –

+0

@NeilHaughton은 내 값이 아닌 데이터베이스에 사용 된 것과 동일한 값 (5, 0)으로 매핑을 지정 했습니까? – Gilles

+0

@NeilHaughton EDMX 파일을 재생성 해 보셨습니까? 그렇지 않은 경우 처음으로 생성 한 이전 값을 여전히 사용하고있을 것입니다. – Gilles