★★★Oracle sql 传参特别注意★★★

  最近遇到一个非常烦人的问题,用传参的方式执行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

posted @ 2015-03-30 14:04  贝加  阅读(1173)  评论(0编辑  收藏  举报