這是我第一次發表博客。以前經常到博客園查找相關技術和代碼,今天在寫一段小程式時出現了問題, 但在網上沒能找到理想的解決方法。故註冊了博客園,想與新手分享(因為本人也不是什麼高手)。 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語句中
變數的順序呢。希望高手提示一下,多謝!
希望能幫到遇到同樣問題的童鞋們。