programing

C#: OracleDb와 Oracle 데이터 유형의 동등성유형

telebox 2023. 7. 16. 13:15
반응형

C#: OracleDb와 Oracle 데이터 유형의 동등성유형


상황:

나는 오라클을 사용하는 앱을 C#에서 만들고 있습니다.데이터 액세스.클라이언트(11g) - 저장 프로시저를 사용하여 Oracle 데이터베이스에서 특정 작업을 수행합니다.Oracle 데이터 유형이 포함된 특정 열거형(OracleDbType)이 있다는 것은 알고 있지만 특정 유형에 대해 어떤 것을 사용해야 할지 모르겠습니다.

질문:

  • OracleDb의 열거된 각 유형에 대해 동일한 Oracle PL/SQL 데이터 유형은 무엇입니까?형식 열거?

  • 세 가지 유형의 정수가 있습니다.
    OracleDbType의 (Int16, Int32, Int64)...어떤 것을 사용해야 하는지 또는 그것들이 모두인지 아는 방법.
    일을 해야 합니까?


다음은 C# 유형을 가장 일반적인 OracleDb로 변환하는 방법입니다.종류들

private static OracleDbType GetOracleDbType(object o) 
{
  if (o is string) return OracleDbType.Varchar2;
  if (o is DateTime) return OracleDbType.Date;
  if (o is Int64) return OracleDbType.Int64;
  if (o is Int32) return OracleDbType.Int32;
  if (o is Int16) return OracleDbType.Int16;
  if (o is sbyte) return OracleDbType.Byte;
  if (o is byte) return OracleDbType.Int16;    -- <== unverified
  if (o is decimal) return OracleDbType.Decimal;
  if (o is float) return OracleDbType.Single;
  if (o is double) return OracleDbType.Double;
  if (o is byte[]) return OracleDbType.Blob;

  return OracleDbType.Varchar2;
}

또한 매우 큰 문자 데이터 값의 경우 사용할 수 있습니다.OracleDbType.Clob.

OracleDb의 값Enumeration 유형은 설명서에 정의되어 있습니다.ODP for .NET 개발자 가이드를 읽어보십시오.

Int16, Int32 및 Int64 중에서 선택하는 것과 관련하여, 그들은 모두 작동해야 합니다.의 예상 크기와 일치하는 것을 선택합니다.순 변수:-32768과 32767 사이의 값의 경우 Int16, -2147483648과 2147483647 사이의 값의 경우 Int32, 더 큰 값의 경우 Int64.Ints 및 PL/SQL 데이터 유형 변환과 관련하여 몇 가지 재미있는 점이 있습니다.마크 윌리엄스의 블로그 게시물을 확인하세요.


코다

2021년 인사.이 게시물은 방금 업로드되었으므로 아마도 검색자들은 여전히 이 게시물을 찾고 유용하다고 느끼고 있을 것입니다.하지만 그것은 10년 이상것임을 알아두시기 바랍니다.결과적으로, 그것이 제공하는 조언은 특히 비정상적인 행동과 관련하여, 더 최근 버전의 ODP와 관련이 없을 수 있습니다.권장 사항을 직접 확인하지 않고 따르지 마십시오.(이것은 소프트웨어 개발뿐만 아니라 인터넷에서 읽는 모든 것에 대한 일반적인 조언입니다!)

다음은 Oracle 21c ODP 설명서와 관련된 링크입니다.

APC의 링크를 확인하십시오. 이 링크가 당신이 찾고 있는 것입니다. 매핑은 열거형의 이름에 따라 매우 간단합니다.

하지만 여러분이 알아차리기 시작한 것처럼, 정수에는 뭔가 까다로운 것이 있습니다.다음은 제 매핑입니다.

  • Int16:NUMBER(5).
  • Int32:NUMBER(10).
  • Int64:NUMBER(19).

문제는 만약 당신이 방문한다면.NUMBER(38)열, 값이 올바른 범위에 있더라도 예외가 발생합니다...

NUMBER(1,0) => 부울

NUMBER(5,0) => Int16.최대값 == 32767

NUMBER(10,0) => Int32.최대 값 == 2,176,483,647

NUMBER(19,0) => Int64.최대값 == 9,223,372,036,854,775,807

NUMBER(19,0) => long.최대값 == 9,223,372,036,854,775,807

부동 소수점에 해당하는 값을 알고자 하는 사용자:

Decimal     Oracle NUMBER type
Double      8-byte FLOAT type

Oracle에서 Number를 사용한 경우에는 소수점을 사용해야 합니다.

APC가 지적한 바와 같이: https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

언급URL : https://stackoverflow.com/questions/1583150/c-oracle-data-type-equivalence-with-oracledbtype

반응형