这是几年前的一个较旧的项目,刚遇到生产问题。 在代码中,它正在建立OracleCommand对象并向其中添加OracleParameters。
using (OracleConnection con = new OracleConnection(Settings.ConnectionString))
using (OracleCommand cmd = new OracleCommand("STORED_PROC_NAME", con))
{
con.Open();
cmd.CommandType = CommandType.StoredProcedure;
//adding some params
cmd.Parameters.Add(new OracleParameter("IN_NODE_IDS", OracleDbType.Varchar2, 8)).Value = string.Join(",", nodeIds);
//adding more params
using (OracleDataReader odr = cmd.ExecuteReader())
nodeIds
是一个字符串列表,其中每个字符串以前最多为6位数字。因此,例如,IN_NODE_IDS
的值可能是:
876345
or
876345,873635,736353
现在,请注意传递给OracleParameter构造函数的size参数。现在是8。上面的两个例子都可以正常工作!
节点ID是来自数据库的自动递增的值。几天前,它们达到了999999,因此下一个插入的记录的ID为1000000。这就是对存储proc的调用开始失败的原因。
据我所知,这样的情况
876345,873635,736353
以前应该已经失败了,但是效果很好。 现在,类似
1000025,1000026
炸毁存储的过程。
将size参数的值增加到4000左右可以很好地解决问题。但是我只是不明白这些年来它是如何工作的。
再想一想。我理解size参数的方式是,如果值比size长,它将截断值。因此,大小为8会将6位数字876345,873635,736353
转换为876345,8
。如果第一个ID的长度为7位数字,那么逗号将以最后一个字符结尾,并以某种方式引起问题。但是,对于7位数的ID,将大小增加到9无效。
Oracle.DataAccess(非托管)DLL版本4.112.1.2。
Oracle Database 12c企业版12.1.0.2.0版-64位生产
编辑:
正如下面的评论所建议的,我查看了存储的proc内部。
它使用IN_NODE_IDS
的唯一一行看起来像这样。
'AND cm.node_id IN (' || in_node_ids || ') ' ||
其中in_node_ids(小写)是Varchar2,它获取由逗号连接的多个id的值。