ORA-01400无法插入空值...但我没有插入空值!

时间:2011-03-16 09:39:19

标签: oracle odp.net oracle-xe ora-01400

我试图通过使用来自C#应用程序的ODP.NET在Oracle表中插入数据,但是我得到一个 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为目标

提前谢谢!

更新

如果我使用(已弃用的)System.Data.OracleClient类而不是ODP.NET,那么一切正常。

WTF,甲骨文?不,真的,WTF?

5 个答案:

答案 0 :(得分:2)

您的问题似乎是您不知道数据库中实际发生了什么。最快的解决方案是找出发生了什么并使用它。

  1. 连接数据库
  2. 使用dbms_session.set_sql_trace(true)启用sql跟踪
  3. 执行您的申请行动
  4. 与数据库断开连接
  5. 查找 - 或询问您的dba - 向您发送原始跟踪文件
  6. 在tracefile(纯文本文件)中找到你的代码,看看在引发错误时会发生什么。

    可能是触发器被触发......

答案 1 :(得分:1)

这是一个数据库级错误消息,您可以确定该插入具有空值。是否可以注销ODP.NET生成的sql语句?

答案 2 :(得分:0)

您是否真的确定insert子句和values子句中的列具有相同的顺序?检查你的“一堆列”......

答案 3 :(得分:0)

我对ODP.net一无所知,但如果参数中有值,那么precison,scale和size属性是否都为零(看起来如此)?

答案 4 :(得分:0)

我们遇到了同样的问题。我们解决了将列属性“IsNullable”设置为true的问题。