我在这里有.net 4.0 c#,IBatisNet和CSLA框架的企业项目。
在程序包中调用insert proc时,其中一个项目作业失败并显示ORA-01084: invalid argument in OCI call
。返回的错误消息最多是神秘的,存储过程有83个输入参数,不受名称约束(感谢IBatis)。
什么是好奇:我有一组记录,我们说Order
和OrderItems
。 Order
有28个订单商品。作业必须通过创建另一个Order
并复制所有OrderItems
记录来续订订单。新订单商品引用了ParentOrderItemId
字段之前的旧订单商品,这也是Orders
因需要续订的选择条件。
当我第一次运行该过程时,OrderItemId: 12345
出现ORA-01084
错误。但是当我下次重新运行它时,它会成功处理OrderItemId: 12345
。然后在OrderItemId: 12444
上爆炸。然后我重新运行并正确处理OrderItemId: 12444
,依此类推。
我已经传递了DbParameters的日志,它们在两种情况下都是相同的。
我有oci客户端跟踪,但它也没用。
我已经设置了数据库层的登录,到目前为止它没有给我任何东西。
如何追踪这些类型的错误?
答案 0 :(得分:4)
我收到了同样的错误消息。在我的情况下,这是因为我将一个空字符串传递给CLOB列。通常我会传递一个大的XML文档,但有时候没有文档。现在,我检查空字符串并写下#34;空"。
答案 1 :(得分:1)
我想这些年来我需要提供一个答案。
问题在于Oracle .Net驱动程序。我们将Qty字段定义为INT。由于内部架构,数量可能为负数或无效。 95%的案例数量是正整数(应该是),但有时由于调整和其他因素,它可能是空的或负的。
所以最后我跟踪了你如何将记录放入数据库的顺序:
数量1 数量0 数量无效 数量-1
正常工作。
但在这种情况下:
数量空 数量1 数量-1
将在“-1”值上使用OCI无效参数。
我在Oracle上创建了一张票,并将其发送给我们的产品团队进行修复。从那以后我继续前进,所以不确定是否以及何时修复。
答案 2 :(得分:0)
对于它的价值,我刚刚遇到了这个错误。我的一个参数中的问题是OracleType
不正确。类型设置为NVarchar
,数据库列已更改为Clob
。
尝试显式定义参数OracleType。
OracleParameter(string name, OracleType oracleType)
答案 3 :(得分:-1)
数据类型为nchar(2)
的可空列对我来说是个问题。
它不接受null,但在插入数据时需要传入一些值。