Oracle db 给出 ORA-01722 似乎没有任何原因

标签 oracle ado.net ora-01722

我正在尝试将 Oracle 数据库与 ado.net 一起使用,事实证明这是一次痛苦的经历。我使用 Oracle 客户端(Oracle.Data 命名空间)。

以下查询在查询窗口中运行良好:

更新 PRINT_ARGUMENT 设置值 = '开始' WHERE REQUEST_ID = 1 AND KEYWORD = '{7D066C95-D4D8-441b-AC26-0F4C292A2BE3}'

当我创建一个 OracleCommand 时,同样的事情会随着 ORA-01722 爆炸。我不明白为什么。

var cmd = cnx.CreateCommand();
cmd.CommandText = @"
UPDATE PRINT_ARGUMENT
SET VALUE = :value 
WHERE REQUEST_ID = :requestID AND KEYWORD = :key";<p></p>

<p>cmd.Parameters.Add(new OracleParameter("requestID", (long)1);
cmd.Parameters.Add(new OracleParameter("key", "{7D066C95-D4D8-441b-AC26-0F4C292A2BE3}");
cmd.Parameters.Add(new OracleParameter("value", "Started");</p>

<p>cnx.Open();
try     { int affected = cnx.ExecuteNonQuery(); }
finally { cnx.Close(); }</p>

<p></p>

当我在调试器中检查命令时,参数似乎已映射到正确的类型:requestID 具有 OracleDbType.Int64,键和值均为 OracleDbType.Varchar2。参数的也是正确的。

当您考虑到我有其他查询使用相同的方法对完全相同的列(requestID、关键字、值)进行操作时,这就变得更加奇怪了——而且它们工作顺利。

记录一下,列类型是requestID NUMBER(10,0);键 VARCHAR2(30);值 VARCHAR2(2000)。

根据 Oracle,ORA-01722 'invalid number' 表示字符串无法转换为数字。我的字符串值都不是数字,为它们创建的 OracleParameters 都不是数字,而且都不是

最佳答案

默认情况下,ODP.NET 绑定(bind)参数按位置,而不是按名称,即使它们在 SQL 中有实际名称(而不仅仅是 ?)。所以,您实际上是将 requestID 绑定(bind)到 :value,将 key 绑定(bind)到 :requestIDvalue:key

在您的代码中更正 cmd.Parameters.Add 的顺序,或使用 BindByName告诉 ODP.NET 使用参数名称。

关于Oracle db 给出 ORA-01722 似乎没有任何原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8119495/

相关文章:

c# - c#中的参数无效异常

oracle - IN 子句的函数或过程

c# - 为什么我会收到 ORA-01722(无效数字)?

mysql - SQL select语句优化(id,parent_id,child_ids)

sql - SQL Oracle 中的减查询

c# - 从具有特定数据库的过程中获取结果

c# - ADO.NET 高效调用存储过程

oracle - sqlplus - 在 "IN"子句中使用绑定(bind)变量

oracle - 第一条记录上的 SQL 加载程序错误

java - 使用 JPA 的不同数据库的不同列类型