这是我第一次发表博客。之前常常到博客园查找相关技术和代码,今天在写一段小程序时出现了问题,sql
但在网上没能找到理想的解决方法。故注册了博客园,想与新手分享(由于本人也不是什么高手)。数据库
vb.net和C#操做Oracle数据库已经用了N多年了。因为是作工程自动化项目的,业主只对软件的功能和小程序
界面是否友好来断定成果的好坏。因此一直都是采用直接OracleCommand.ExecuteNonQuery(sqlString,conn)测试
的方式很直白的Insert、update和delete数据库表的。因为工程项目并无很高的实时性,因此......spa
最近手头没太多事情,就在博客园逛逛。看到了ODP.NET,发现了本身有点落伍了,因而照猫画虎的练练。.net
在Insert时顺风顺水的,但Update时出现了“ORA-01722: 无效数字”。各类找问题,网上查资料无果。code
测试表只有两个字段,varchar2和number。问题代码以下:blog
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了。cmd
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语句中
变量的顺序呢。但愿高手提示一下,多谢!
但愿能帮到遇到一样问题的童鞋们。