С#: эквивалентность типа данных 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
Ответ 5
Для тех, кто хочет знать эквивалент де плавающих точек:
Decimal Oracle NUMBER type
Double 8-byte FLOAT type
Десятичная дробь - путь, если вы использовали Number в Oracle.
Как указал APC:https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm