ORA-01400 не может вставить нулевое значение... но я НЕ вставляю нулевое значение!

Я пытаюсь вставить данные в таблицу 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?

5 ответов

Кажется, ваша проблема в том, что вы не знаете, что на самом деле происходит в базе данных. Самым быстрым решением будет выяснить, что происходит, и использовать это.

  1. подключиться к базе данных
  2. используйте dbm s_session.set_sql_trace(true), чтобы включить трассировку SQL
  3. выполнить действие вашего приложения
  4. отключиться от базы данных
  5. найти - или попросить ваш DBA - отправить вам файл необработанных трассировки

В файле трассировки (простой текстовый файл) найдите свой код и посмотрите, что происходит, когда возникает ошибка.

Может быть, что курок сработал....

Это сообщение об ошибке уровня базы данных, вы можете быть уверены, что вставка имеет нулевое значение. Можно ли выйти из оператора sql, созданного ODP.NET?

Ну, я ничего не знаю о ODP.net, но если в параметре есть значение, должны ли атрибуты precison, scale и size быть равны нулю (как они кажутся)?

У нас была такая же проблема. Мы решили проблему, установив для свойства столбца "IsNullable" значение true.

Вы действительно уверены, что у вас есть столбцы в одинаковом порядке как в предложении вставки, так и в предложении значений? Проверьте свою "связку колонн" ...

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