我正在尝试将 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)到 :requestID 和 value 到 :key。
在您的代码中更正 cmd.Parameters.Add
的顺序,或使用 BindByName告诉 ODP.NET 使用参数名称。
关于Oracle db 给出 ORA-01722 似乎没有任何原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8119495/