这是我第一次发表博客。以前经常到博客园查找相关技术和代码,今天在写一段小程序时出现了问题,
但在网上没能找到理想的解决方法。故注册了博客园,想与新手分享(因为本人也不是什么高手)。
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语句中
变量的顺序呢。希望高手提示一下,多谢!
希望能帮到遇到同样问题的童鞋们。
-