ODP 使用 ArrayBind 时可能会遇到的巨坑 'System.IConvertible' 的解决方法

Unable to cast object of type 'System.Nullable`1[System.Int16][]' to type 'System.IConvertible'


 

一段代码99%不会出错,0.1%会报上边的错,debug费了老鼻子时间,发现此坑很深。异常是 cmd.ExecuteNonQuery() 抛的,实际是 para.Value = list.Select(d => d.ID).ToArray() 引起的,但是此句实在是没毛病啊!。。。。。。。。哪?。。。。。。。。而最终原因是数据源数量为0,list.Count=0。list.Count=0的情况下,用 ArrayBind 实际本无意义了,所以解决方案是加上行判断if(list.Count>0)。

而99%不报错是99%的情况下数据不为空。


 

var q = from d in db.tbl  select d;

var list = q.ToList();

if(list.Count>0)     //如果数据集为空还执行,会报 ...'System.IConvertible' 的异常
{
var cmd =...

cmd.ArrayBindCount = list.Count();
cmd.BindByName = true;

var para = new Oracle.ManagedDataAccess.Client.OracleParameter();
para.ParameterName = "ID";
para.OracleDbTypeEx = Oracle.ManagedDataAccess.Client.OracleDbType.NVarchar2;
para.Direction = System.Data.ParameterDirection.Input;
para.Value = list.Select(d => d.ID).ToArray();     //0.1%这里报异常
cmd.Parameters.Add(para);

cmd.ExecuteNonQuery();
}

posted @ 2018-08-15 17:39  flyGy  阅读(760)  评论(0编辑  收藏  举报