C# Oracle.ManagedDataAccess 批量更新表数据
程序员文章站
2022-03-29 10:35:07
这是我第一次发表博客。以前经常到博客园查找相关技术和代码,今天在写一段小程序时出现了问题, 但在网上没能找到理想的解决方法。故注册了博客园,想与新手分享(因为本人也不是什么高手)。 vb.net和C#操作Oracle数据库已经用了N多年了。由于是做工程自动化项目的,业主只对软件的功能和 界面是否友好 ......
这是我第一次发表博客。以前经常到博客园查找相关技术和代码,今天在写一段小程序时出现了问题,
但在网上没能找到理想的解决方法。故注册了博客园,想与新手分享(因为本人也不是什么高手)。
vb.net和c#操作oracle数据库已经用了n多年了。由于是做工程自动化项目的,业主只对软件的功能和
界面是否友好来判定成果的好坏。所以一直都是采用直接oraclecommand.executenonquery(sqlstring,conn)
的方式很直白的insert、update和delete数据库表的。由于工程项目并没有很高的实时性,所以......
最近手头没太多事情,就在博客园逛逛。看到了odp.net,发现了自己有点落伍了,于是照猫画虎的练练。
在insert时顺风顺水的,但update时出现了“ora-01722: 无效数字”。各种找问题,网上查资料无果。
测试表只有两个字段,varchar2和number。问题代码如下:
using oracle.manageddataaccess.client;
private void updatetable() { int valuestart = (int)nudstartvalue.value; int valuecount = (int)nudvaluecount.value; int returnvalue = 0; int[] columnvalue = new int[valuecount]; string[] columnstr = new string[valuecount]; string sql = string.empty; oracleparameter[] parameters = new oracleparameter[] { new oracleparameter(":sname", oracledbtype.varchar2), new oracleparameter(":svalue",oracledbtype.int32) }; parameters[0].direction = parameterdirection.input; parameters[1].direction = parameterdirection.input; for ( int i = 0 ; i < valuecount ; i++ ) { columnstr[i] = "no:" + ( i + valuestart ).tostring(); columnvalue[i] = i + valuestart + 100; } parameters[0].value = columnstr; parameters[1].value = columnvalue; sql = "update dist_test set svalue=:svalue where sname=:sname"; returnvalue = db.runupdatesql(sql, parameters, valuecount);
messagebox.show(returnvalue.tostring());
}
public int runupdatesql(string sqlstr,oracleparameter[] parameters,int paracount) { int returnvalue = 0; try { open(); oraclecommand cmd = new oraclecommand() { connection = conn, arraybindcount=paracount, commandtext=sqlstr, commandtimeout=240 }; cmd.parameters.addrange(parameters); returnvalue=cmd.executenonquery(); cmd.dispose(); } catch(exception ex) { console.writeline(ex.tostring()); } return returnvalue; }
解决方法:将parameters的元素按sqlstr的顺序更改一下ok了。
private void updatetable() { int valuestart = (int)nudstartvalue.value; int valuecount = (int)nudvaluecount.value; int returnvalue = 0; int[] columnvalue = new int[valuecount]; string[] columnstr = new string[valuecount]; string sql = string.empty; oracleparameter[] parameters = new oracleparameter[] { new oracleparameter(":svalue",oracledbtype.int32), new oracleparameter(":sname", oracledbtype.varchar2) }; parameters[0].direction = parameterdirection.input; parameters[1].direction = parameterdirection.input; for ( int i = 0 ; i < valuecount ; i++ ) { columnstr[i] = "no:" + ( i + valuestart ).tostring(); columnvalue[i] = i + valuestart + 100; } parameters[0].value = columnvalue; parameters[1].value = columnstr; sql = "update dist_test set svalue=:svalue where sname=:sname"; returnvalue = db.runupdatesql(sql, parameters, valuecount);
messagebox.show(returnvalue.tostring());
}
注意上面的代码,第一个出现的是:svalue,第二个出现的是:sname。oracleparameter[]按这个顺序添加就ok了。
其实现在问题是解决了,但还没能理解,:sname和:svalue是对应的parameter.value的,为何一定要按照update语句中
变量的顺序呢。希望高手提示一下,多谢!
希望能帮到遇到同样问题的童鞋们。