這是我第一次發表博客。之前常常到博客園查找相關技術和代碼,今天在寫一段小程序時出現了問題,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語句中
變量的順序呢。但願高手提示一下,多謝!
但願能幫到遇到一樣問題的童鞋們。