我试图通过使用来自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
:
但是,如果我直接在Application Express中执行命令(直接在命令文本中提供值),它可以正常工作并插入行。
那么,这里发生了什么? ODP.NET库中是否有错误,或者我做错了什么?
其他信息:
提前谢谢!
更新
如果我使用(已弃用的)System.Data.OracleClient
类而不是ODP.NET,那么一切正常。
WTF,甲骨文?不,真的,WTF?
答案 0 :(得分:2)
您的问题似乎是您不知道数据库中实际发生了什么。最快的解决方案是找出发生了什么并使用它。
在tracefile(纯文本文件)中找到你的代码,看看在引发错误时会发生什么。
可能是触发器被触发......
答案 1 :(得分:1)
这是一个数据库级错误消息,您可以确定该插入具有空值。是否可以注销ODP.NET生成的sql语句?
答案 2 :(得分:0)
您是否真的确定insert子句和values子句中的列具有相同的顺序?检查你的“一堆列”......
答案 3 :(得分:0)
我对ODP.net一无所知,但如果参数中有值,那么precison,scale和size属性是否都为零(看起来如此)?
答案 4 :(得分:0)
我们遇到了同样的问题。我们解决了将列属性“IsNullable”设置为true的问题。