C #: Equivalencia del tipo de datos Oracle con OracleDbType


Situación:

Estoy creando una aplicación en C # que usa Oracle.DataAccess.Client (11g) para realizar ciertas operaciones en una base de datos Oracle con procedimientos almacenados. Soy consciente de que hay cierta enum (OracleDbType) que contiene los tipos de datos de Oracle, pero no estoy seguro de cuál usar para ciertos tipos.

Preguntas:


Los valores de la Enumeración OracleDbType se definen en la documentación. Lea el ODP para .NET Developer’s Guide .

Con respecto a elegir entre Int16, Int32 e Int64, se supone que todos deben funcionar. Elija el que coincida con el tamaño esperado de su variable .Net: Int16 para valores entre -32768 y 32767, Int32 para valores entre -2147483648 y 2147483647, e Int64 para cualquier cantidad mayor. Parece haber algunos divertidos relacionados con la conversión de tipos de datos Ints y PL / SQL. Mira esta publicación de blog de Mark Williams .

Aquí hay un método para convertir tipos de C # a los tipos de OracleDb más comunes

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; } 

Además, para valores de datos de caracteres muy grandes, es posible que desee utilizar OracleDbType.Clob .

Compruebe los enlaces de APC , son lo que está buscando: el mapeo es bastante sencillo de acuerdo con el nombre de la enumeración.

Pero como comenzaste a notar, hay algo complicado sobre los enteros. Aquí está mi mapeo:

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

Lo que GetInt64 es que si llama a GetInt64 en una columna NUMBER(38) , obtendrá una excepción incluso si el valor está en el rango correcto …

NUMBER (1,0) => Booleano

NUMBER (5,0) => Int16.MaxValue == 32767

NUMBER (10,0) => Int32.MaxValue == 2,147,483,647

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

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