ORA-01400 не может вставить нулевое значение ... но я НЕ вставляю нулевое значение! - PullRequest
5 голосов
/ 16 марта 2011

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

enter image description here

Однако, если я выполню команду непосредственно в 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?

Ответы [ 5 ]

2 голосов
/ 16 марта 2011

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

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

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

Возможно, сработал триггер ....

1 голос
/ 16 марта 2011

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

0 голосов
/ 16 марта 2011

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

0 голосов
/ 16 марта 2011

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

0 голосов
/ 16 марта 2011

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

...