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


Ситуация:

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

Вопросов:

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

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


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

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

Вот способ преобразования типов C # в наиболее распространенные 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 .

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

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

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

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

NUMBER (1,0) => Boolean

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

Давайте будем гением компьютера.