OracleParameter的值大于定义的大小

时间:2018-08-21 15:02:50

标签: c# oracle parameter-passing oracle12c

这是几年前的一个较旧的项目,刚遇到生产问题。 在代码中,它正在建立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的值。

0 个答案:

没有答案