最近遇到一个非常烦人的问题,用传参的方式执行sql语句结果老是报 Oracle ORA-01722: 无效数字 一直无法找到原因。
表结构大致如下:
table test_station
(
tblRcdId varchar2(50) sys_guid(),--标识列
strLon number(10,6), --经度
strLat number(10,6) --纬度
)
更新代码如下:
string sql = "update test_station set strlon=:strlon,strlat=:strlat where tblrcdId=:tblrcdId";
List<OracleParameter> param_list = new List<OracleParameter>();
param_list.Add(new OracleParameter("tblrcdId", OracleDbType.Varchar2, ParameterDirection.Input));
param_list[0].Value = "10DDEB47EC0AC6E0E0531F2C220AB47E";
param_list.Add(new OracleParameter("strlon02", OracleDbType.Double, ParameterDirection.Input));
param_list[1].Value = 121.123456d;
param_list.Add(new OracleParameter("strlat02", OracleDbType.Double, ParameterDirection.Input));
param_list[2].Value = 31.123456d;
// 执行sql语句代码
int flag = DBContext.ExecSql(sql,param_list.ToArray());
结果一直报错 Oracle ORA-01722: 无效数字
查找原因许久一直没有结果,很是让人郁闷。不知大家是否发现问题所在???
后来把添加参数的顺序改为按sql语句中参数的顺序添加,如下:
List<OracleParameter> param_list = new List<OracleParameter>();
param_list.Add(new OracleParameter("strlon02", OracleDbType.Double, ParameterDirection.Input));
param_list[0].Value = 121.123456d;
param_list.Add(new OracleParameter("strlat02", OracleDbType.Double, ParameterDirection.Input));
param_list[1].Value = 31.123456d;
param_list.Add(new OracleParameter("tblrcdId", OracleDbType.Varchar2, ParameterDirection.Input));
param_list[2].Value = "10DDEB47EC0AC6E0E0531F2C220AB47E";
然后再次执行,竟然成功了。
很是纳闷,既然有参数名,为何参数列表的顺序还必须和sql中参数的顺序保持一致?难道不是自动去对应的么?
特在此发文记录,以作提醒!
终于从网上发现解决方法:
设置属性: OracleCommand.BindByName = true; // 默认是false,是按参数顺序匹配值的。
请参考:http://www.cnblogs.com/gucsnet/archive/2007/07/16/820399.html