5

我正在尝试使用 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?

4

5 回答 5

2

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

  1. 连接到数据库
  2. 使用 dbms_session.set_sql_trace(true) 启用 sql 跟踪
  3. 做你的申请动作
  4. 断开与数据库的连接
  5. 查找 - 或询问您的 dba - 向您发送原始跟踪文件

在跟踪文件(纯文本文件)中找到您的代码并查看引发错误时会发生什么。

可能是触发器触发了....

于 2011-03-16T12:25:29.537 回答
1

这是一条 DB 级别的错误消息,您可以确定插入的值为空。是否可以注销ODP.NET生成的sql语句?

于 2011-03-16T09:50:24.923 回答
0

您真的确定插入子句和值子句中的列顺序相同吗?检查你的“一堆列”......

于 2011-03-16T09:45:36.593 回答
0

好吧,我对 ODP.net 一无所知,但是如果参数中有一个值,那么精度、比例和大小属性是否应该都为零(看起来是这样)?

于 2011-03-16T09:50:33.450 回答
0

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

于 2011-03-16T09:53:48.503 回答