Конструктор параметров odp net oracle с логическим объектом
Я использую odp OracleParameter конструктор:
public OracleParameter(string parameterName, object obj);
Когда я передаю различные типы объектов типа int или DateTime, он работает нормально. Однако, когда я использую Bool, как это:
new OracleParameter("paramName", true)
происходит сбой с "System.ArgumentException".
Почему это не работает со значениями bool? Есть ли известные типы, где это не работает?
Я использую Oracle ManagedDataAccess.dll v4.121.2.0
1 ответ
Oracle не поддерживает bool
значения как DataType для его столбцов (PL/SQL - другое дело).
Сначала вы должны проверить тип данных вашего bool
поле / параметр в Oracle.
Если это что-то вроде NUMBER
используйте следующий код:
new OracleParameter("paramName", OracleDbType.Int16, 1);
Здесь третьим параметром является размер NUMBER
значение.
Как вы упомянули в ваших комментариях, вы можете использовать этот конструктор:
public OracleParameter(string parameterName, OracleDbType type, object obj,
ParameterDirection direction);
Что позволяет пропустить определение размера.
В противном случае я бы преобразовал его в NUMBER
так как OracleDbType
enum не содержит значения для BOOLEAN
,
Я всегда указываю OracleDbType при создании нового параметра Oracle. Это делает вещи более явными и предотвращает подобные ошибки.
Я не собираюсь вдаваться в избыточность, объясняя Oracle DB. Но хочу, чтобы вы поняли, что типы Oracle не соответствуют типам.NET, таким как типы Sql Server.
Например, чтобы соответствовать int
значение в Oracle, вам нужно создать столбец NUMBER(10)
, Этот размер, однако, больше, чем int
и когда вы делаете Select col1. . .
это возвращается long
, Итак, вам нужно сделать Convert.ToInt32(reader["col1"])
"вписать" ваши данные в int
в вашем приложении.
То же самое и с логическим значением здесь. Точного типа нет. Иногда люди хранят фальшивые логические выражения в Number(1)
или даже в Varchar2(1)
как "Y"/"N" (например). Итак, если ваша БД имеет какой-либо числовой тип данных, просто сделайте
bool val = GetVal();
var p = new OracleParameter("paramName", Convert.ToInt32(val))
Это даст вам 1
за true
а также 0
за false