Конструктор параметров 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

Другие вопросы по тегам