https:
... Я пытаюсь вставить данные в таблицу Oracle с помощью ODP.NET из приложения C #, но получаю сообщение ORA-01400 не может вставить нулевое значение для столбца в котором я НЕ вставляю нулевое значение.
Это урезанная версия параметризованной команды SQL, которую я пытаюсь выполнить. Он заключен в OracleCommand
и выполняется с вызовом ExecuteNonQuery
:
declare c int;
begin
select count(*) into c from "Entradas" where "Id" = :Id and nvl("AppId", 0) = nvl(:AppId, 0);
if c>0 then
update "Entradas" set
/*...a bunch of columns...*/,
"VisitaLaboral" = :VisitaLaboral,
/*...some more columns...*/
where "Id" = :Id and nvl("AppId",0) = nvl(:AppId, 0);
else
insert into "Entradas" (
/*... a bunch of columns...*/,
"VisitaLaboral",
/*...some more columns...*/
) values (
/*...a bunch of values...*/,
:VisitaLaboral,
/*...some more values...*/
);
end if;
end;
Строка ранее не существовала, поэтому это часть команды insert
. тот, который выполняется. Конечно, я убедился, что все имена столбцов и параметры значений столбцов правильно помещены в текст SQL.
Проблема находится в столбце VisitaLaboral
. Он имеет тип NUMBER (1,0), он не принимает значения NULL, и я пытаюсь вставить значение 0. Это то, что Visual Studio отображает о связанном OracleParameter
непосредственно перед выполнением команды:
Однако, если я выполняю команду непосредственно в Application Express (предоставляя значения непосредственно в тексте команды), она работает нормально и строка вставлена.
Итак, что здесь происходит? Есть ли ошибка в библиотеке ODP.NET или я что-то делаю не так?
Дополнительная информация:
- База данных - это Oracle 10g Express Release 10.2.0.1.0
- Oracle.DataAccess.dll версия 4.112. 1.2
- Использование Visual Studio 2010, таргетинг на .NET framework 4.0
Заранее спасибо!
ОБНОВЛЕНИЕ:
Все работает нормально, если я использую (устаревший) System.Data.OracleClient
вместо ODP.NET.
WTF, Oracle? Нет, правда, WTF?