我正在尝试使用 C# 应用程序中的 ODP.NET 在 Oracle 表中插入数据,但我收到ORA-01400 can't insert null value错误,因为我没有在其中插入空值。
这是我试图执行的参数化 SQL 命令的精简版本。它被包装在 an 中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 StudioOracleParameter
在命令执行前立即显示的有关关联的内容:
但是,如果我直接在 Application Express 中执行命令(直接在命令文本中提供值),它可以正常工作并插入行。
那么,这里发生了什么?ODP.NET 库中是否存在错误,或者我做错了什么?
附加信息:
- 数据库是 Oracle 10g Express Release 10.2.0.1.0
- Oracle.DataAccess.dll 版本为 4.112.1.2
- 使用 Visual Studio 2010,面向 .NET 框架 4.0
先感谢您!
更新:
如果我使用(已弃用)System.Data.OracleClient
类而不是 ODP.NET,一切正常。
WTF,甲骨文?不,真的,WTF?