我正在尝试通过ado.net使用Oracle数据库,事实证明这是一种痛苦的体验。我使用Oracle Client(Oracle.Data namespace )。
以下查询可从查询窗口正常运行:UPDATE PRINT_ARGUMENTSET VALUE = 'Started'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(); }
finally { cnx.Close(); }
当我在调试器中检查命令时,参数似乎已映射到正确的类型:requestID具有OracleDbType.Int64,键和值均为OracleDbType.Varchar2。参数值也正确。
当您考虑到我还有其他查询使用相同的方法对完全相同的列(requestID,关键字,值)进行操作时,这一点就变得更奇怪了,它们不会打h。
对于记录,列类型为requestID NUMBER(10,0);键VARCHAR2(30);值VARCHAR2(2000)。
根据Oracle的说法,ORA-01722“无效数字”表示字符串无法转换为数字。我的两个字符串值都不是数字,为它们创建的OracleParameters都不是数字,也不是
最佳答案
由于使用的是命名参数,因此必须将其告知Oracle客户端。否则,您的参数会混淆(将键分配给:value):
OracleParameter parameter = new OracleParameter("requestID", (long)1);
parameter.BindByName = true;
cmd.Parameters.Add(parameter);
这是一种奇怪的意外行为,但事实就是如此。