【发布时间】:2011-07-16 10:52:19
【问题描述】:
我正在尝试使用 C# 应用程序中的 ODP.NET 在 Oracle 表中插入数据,但我收到 ORA-01400 can't insert null value 错误我没有插入空值。
这是我尝试执行的参数化 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,甲骨文?不,真的,WTF?
【问题讨论】:
-
我不知道,但 this question 可能会让你感兴趣。
-
您是否尝试过 ODP 中的“command.bindbyname = True”(System.Data.OracleClient 默认按名称绑定,而 ODP 默认按位置绑定)。试试 bindbyname=true 看看会发生什么
-
@Harrison:是的,在另一个 SO 问题中看到并尝试过,但也没有用。
-
7 年后仍然遇到类似的事情......我放了 if 语句以防止在我的数据上下文中插入空值,但仍然设法尝试插入空值......
标签: oracle odp.net oracle-xe ora-01400