С#: эквивалентность типа данных Oracle с OracleDbType


Ситуация:

Я создаю приложение на С#, которое использует Oracle.DataAccess.Client(11g) для выполнения определенных операций с базой данных Oracle с хранимыми процедурами. Я знаю, что существует определенный enum (OracleDbType), который содержит типы данных Oracle, но я не уверен, какой из них использовать для определенных типов.

Вопросы:

  • Что такое эквивалентные данные Oracle PL/SQL тип для каждого перечисленного типа в перечисление OracleDbType?

  • Существует три типа целых чисел (Int16, Int32, Int64) в OracleDbType... как узнать какой из них использовать или все они - предположим работать?


Ответы

Ответ 1

Значения перечисления OracleDbType перечислены в документации. Прочтите Руководство разработчика ODP для .NET.

Что касается выбора между Int16, Int32 и Int64, все они должны работать. Выберите ту, которая соответствует ожидаемому размеру вашей .Net-переменной: Int16 для значений между -32768 и 32767, Int32 для значений между -2147483648 и 2147483647 и Int64 для чего-либо большего. Похоже, что есть некоторые смешения, связанные с преобразованием типов данных Ints и PL/SQL. Проверьте Это сообщение в блоге от Марка Уильямса.

Ответ 2

Здесь показан способ преобразования типов С# в наиболее распространенные OracleDbTypes

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.

Ответ 3

Проверьте ссылки APC, они - то, что вы ищете: сопоставление довольно простое в соответствии с названием перечисления.

Но, как вы начали замечать, есть что-то сложное в отношении целых чисел. Вот мое отображение:

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

Дело в том, что если вы вызовете GetInt64 в столбце NUMBER(38), вы получите исключение, даже если это значение в правильном диапазоне...

Ответ 4

NUMBER (1,0) = > Boolean

НОМЕР (5,0) = > Int16.MaxValue == 32767

НОМЕР (10,0) = > Int32.MaxValue == 2,147,483,647

НОМЕР (19,0) = > Int64.MaxValue == 9,223,372,036,854,775,807

НОМЕР (19,0) = > long.MaxValue == 9,223,372,036,854,775,807