Я пытаюсь вставить данные в таблицу 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
Заранее спасибо!
UPDATE:
Все работает нормально, если я использую (устаревшие) System.Data.OracleClient
классы вместо ODP.NET.
WTF, Oracle? Нет, правда, WTF?