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

我正在尝试将一个Oracle数据库与ado.net一起使用,这证明是一种痛苦的经历.我使用Oracle Client(Oracle.Data名称空间).

以下查询查询​​窗口运行正常:

更新PRINT_ARGUMENT
SET VALUE =’已启动’
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";

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”);

cnx.open();
try {int affected = cnx.ExecuteNonQuery(); }
终于{cnx.Close(); }

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

当你考虑我使用相同的方法在完全相同的列(requestID,keyword,value)上运行其他查询时,这甚至会变得更加奇怪 – 并且它们在没有打嗝的情况下工作.

对于记录,列类型是requestID NUMBER(10,0); key VARCHAR2(30);值VARCHAR2(2000).

据Oracle称,ora-01722’无效数字’表示字符串无法转换为数字.我的字符串值都不是数字,为它们创建的OracleParameters都不是数字,也不是

解决方法

由于您使用的是命名参数,因此必须告诉Oracle客户端.否则,您的参数会被混淆(键被赋值为:value):

OracleParameter parameter = new OracleParameter("requestID",(long)1);
parameter.BindByName = true;
cmd.Parameters.Add(parameter);

这是一种奇怪而意外的行为,但事实就是如此.

相关文章

Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...