经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C# Oracle.ManagedDataAccess 批量更新表数据
来源:cnblogs  作者:我是大黑  时间:2018/11/29 9:32:03  对本文有异议

    这是我第一次发表博客。以前经常到博客园查找相关技术和代码,今天在写一段小程序时出现了问题,

但在网上没能找到理想的解决方法。故注册了博客园,想与新手分享(因为本人也不是什么高手)。

    vb.net和C#操作Oracle数据库已经用了N多年了。由于是做工程自动化项目的,业主只对软件的功能和

界面是否友好来判定成果的好坏。所以一直都是采用直接OracleCommand.ExecuteNonQuery(sqlString,conn)

的方式很直白的Insert、update和delete数据库表的。由于工程项目并没有很高的实时性,所以......

    最近手头没太多事情,就在博客园逛逛。看到了ODP.NET,发现了自己有点落伍了,于是照猫画虎的练练。

在Insert时顺风顺水的,但Update时出现了“ORA-01722: 无效数字”。各种找问题,网上查资料无果。

测试表只有两个字段,varchar2和number。问题代码如下:

  1. using Oracle.ManagedDataAccess.Client;

 

  1. private void UpdateTable()
  2. {
  3. int valueStart = (int)NudStartValue.Value;
  4. int valueCount = (int)NudValueCount.Value;
  5. int returnValue = 0;
  6. int[] columnValue = new int[valueCount];
  7. string[] columnStr = new string[valueCount];
  8. string sql = string.Empty;
  9. OracleParameter[] parameters = new OracleParameter[]
  10. {
  11. new OracleParameter(":sname", OracleDbType.Varchar2),
  12. new OracleParameter(":svalue",OracleDbType.Int32)
  13. };
  14. parameters[0].Direction = ParameterDirection.Input;
  15. parameters[1].Direction = ParameterDirection.Input;
  16. for ( int i = 0 ; i < valueCount ; i++ )
  17. {
  18. columnStr[i] = "No:" + ( i + valueStart ).ToString();
  19. columnValue[i] = i + valueStart + 100;
  20. }
  21. parameters[0].Value = columnStr;
  22. parameters[1].Value = columnValue;
  23. sql = "update DIST_TEST set SVALUE=:svalue where SNAME=:sname";
  24. returnValue = db.RunUpdateSQL(sql, parameters, valueCount);
    MessageBox.Show(returnValue.ToString());
    }

 

  1. public int RunUpdateSQL(string sqlStr,OracleParameter[] parameters,int paraCount)
  2. {
  3. int returnValue = 0;
  4. try
  5. {
  6. Open();
  7. OracleCommand cmd = new OracleCommand()
  8. {
  9. Connection = Conn,
  10. ArrayBindCount=paraCount,
  11. CommandText=sqlStr,
  12. CommandTimeout=240
  13. };
  14. cmd.Parameters.AddRange(parameters);
  15. returnValue=cmd.ExecuteNonQuery();
  16. cmd.Dispose();
  17. }
  18. catch(Exception ex)
  19. {
  20. Console.WriteLine(ex.ToString());
  21. }
  22. return returnValue;
  23. }

解决方法:将parameters的元素按sqlStr的顺序更改一下OK了。

 

  1. private void UpdateTable()
  2. {
  3. int valueStart = (int)NudStartValue.Value;
  4. int valueCount = (int)NudValueCount.Value;
  5. int returnValue = 0;
  6. int[] columnValue = new int[valueCount];
  7. string[] columnStr = new string[valueCount];
  8. string sql = string.Empty;
  9. OracleParameter[] parameters = new OracleParameter[]
  10. {
  11. new OracleParameter(":svalue",OracleDbType.Int32),
  12. new OracleParameter(":sname", OracleDbType.Varchar2)
  13. };
  14. parameters[0].Direction = ParameterDirection.Input;
  15. parameters[1].Direction = ParameterDirection.Input;
  16. for ( int i = 0 ; i < valueCount ; i++ )
  17. {
  18. columnStr[i] = "No:" + ( i + valueStart ).ToString();
  19. columnValue[i] = i + valueStart + 100;
  20. }
  21. parameters[0].Value = columnValue;
  22. parameters[1].Value = columnStr;
  23. sql = "update DIST_TEST set SVALUE=:svalue where SNAME=:sname";
  24. returnValue = db.RunUpdateSQL(sql, parameters, valueCount);
    MessageBox.Show(returnValue.ToString());
    }

    注意上面的代码,第一个出现的是:svalue,第二个出现的是:sname。OracleParameter[]按这个顺序添加就OK了。

其实现在问题是解决了,但还没能理解,:sname和:svalue是对应的parameter.value的,为何一定要按照update语句中

变量的顺序呢。希望高手提示一下,多谢!

    希望能帮到遇到同样问题的童鞋们。

 

  1.  
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号