2013-03-12 64 views
2

我正嘗試在Visual Studio 2010 Ultimate中執行更新操作,Windows窗體作爲前端,Oracle 11g作爲後端表達。 我正在使用C#編寫代碼。錯誤更新查詢-Visual Studio 2010- Oracle 11g Express版

private void update_student(string STUDENT_ID, string STUDENT_NAME, string  STUDENT_ADDRESS) 
{ 
     con.Open(); 

     String sql = "UPDATE STUDENT SET STUDENT_NAME = :STUDENT_NAME, STUDENT_ADDRESS= :STUDENT_ADDRESS WHERE STUDENT_ID= :STUDENT_ID"; 

     OracleCommand query = new OracleCommand(sql, con); 

     OracleParameter[] updatestud = new OracleParameter[3]; 

     updatestud[0] = query.Parameters.Add("STUDENT_ID", OracleDbType.Varchar2, STUDENT_ID, ParameterDirection.Input); 
     updatestud[1] = query.Parameters.Add("STUDENT_NAME", OracleDbType.Varchar2, STUDENT_NAME, ParameterDirection.Input); 
     updatestud[2] = query.Parameters.Add("STUDENT_ADDRESS", OracleDbType.Varchar2, STUDENT_ADDRESS, ParameterDirection.Input); 

     query.ExecuteNonQuery(); 

     MessageBox.Show("Row Updated"); 

     con.Close(); 

} 

執行插入和檢索操作後,我正在嘗試更新查詢。

我無法理解我在應用程序中使用的以下代碼的參數和值的流程。 我得到的query.ExecuteNonQuery();線以下錯誤:

ORA-01722:無效數字

任何幫助將非常感激。

+0

你確定你的Student_ID是一個字符串嗎? – nvoigt 2013-03-12 14:04:14

+0

你的STUDENT_ID是什麼? – 2013-03-12 14:19:58

回答

2

ORA-01722

,因爲該字符串不是有效的數字文本字符串到數字的嘗試轉換失敗 。在算術函數或表達式中,只能使用 數字字段或包含數字數據的字符字段。只有數字字段可以是 添加到日期或從日期中減去。

此錯誤可能會導致您可能會嘗試將您的STUDENT_ID定義爲OracleDbType.Varchar2

我不知道你的STUDENT_ID多久,但你可以使用OracleDbType.Int32而不是。

贊;

updatestud[0] = query.Parameters.Add("STUDENT_ID", OracleDbType.Int32 , STUDENT_ID, ParameterDirection.Input); 

查看詳情OracleType枚舉。

指定在OracleParameter中使用的字段或屬性的數據類型。

+0

嗨Soner!我糾正了這段代碼。非常感謝俞的迴應。我仍然面臨同樣的錯誤。幫幫我!! :(我的STUDENT_ID大約是3位數字,例如:100,123,300,400 – Sakthi 2013-03-14 15:29:03

+0

@ user2161121你可以問一個單獨的問題,或者你可以在你的問題中更新.. – 2013-03-14 15:30:25

+0

哈哈!!我很新的堆棧溢出。 ?!:p無論如何有什麼建議嗎? – Sakthi 2013-03-14 15:38:13

1

我在想STUDENT_ID可能是整數。你正在使用它作爲Varchar2,這似乎是錯誤的原因。

ORA-01722:無效號碼 原因:嘗試將字符串轉換爲數字失敗,因爲字符串不是有效的數字文字。算術函數或表達式中只能使用包含數字數據的數字字段或字符字段。只有數字字段可以添加到日期或從日期中減去。

+0

嗨。感謝你的回覆。感覺如此的熟悉以便知道某人正在傾聽.. :)即使在更改Oracle類型之後,也出現了同樣的錯誤。任何想法..?? – Sakthi 2013-03-14 15:27:37

+0

將STUDENT_ID轉換爲Integer,同時傳遞給database.updatestud [0] = query.Parameters.Add(「STUDENT_ID」,OracleDbType.Varchar2,int.parse(STUDENT_ID),ParameterDirection.Input);可能你可以試試這個。 – 2013-03-14 16:09:36

+0

它仍然沒有工作。同樣的錯誤 – Sakthi 2013-03-16 06:01:57

0

嗨,人們:)我自己找到了答案。只是想到與大家分享。

有兩種方法可以完成此操作。

方法1:

OracleParameter[] updatestud = new OracleParameter[3]; 
     updatestud[0] = query.Parameters.Add(":STUDENT_NAME", OracleDbType.Varchar2, STUDENT_NAME, ParameterDirection.Input); 
     updatestud[1] = query.Parameters.Add(":STUDENT_ADDRESS", OracleDbType.Varchar2, STUDENT_ADDRESS, ParameterDirection.Input); 
     updatestud[2] = query.Parameters.Add("STUDENT_ID", OracleDbType.Int32, STUDENT_ID, ParameterDirection.Input); 

方法2:

  String sql = "UPDATE STUDENT SET STUDENT_NAME = :STUDENT_NAME, STUDENT_ADDRESS= :STUDENT_ADDRESS WHERE STUDENT_ID= :STUDENT_ID"; 
     OracleCommand query = new OracleCommand(sql, con); 

     OracleParameter p_studid = new OracleParameter(); 
     OracleParameter p_studname = new OracleParameter(); 
     OracleParameter p_studaddr = new OracleParameter(); 

     p_studname.OracleDbType = OracleDbType.Varchar2; 
     p_studname.Value = TxtName.Text; 
     query.Parameters.Add(p_studname); 

     p_studaddr.OracleDbType = OracleDbType.Varchar2; 
     p_studaddr.Value = TxtAddress.Text; 
     query.Parameters.Add(p_studaddr); 

     p_studid.OracleDbType = OracleDbType.Int32; 
     p_studid.Value = TxtId.Text; 
     query.Parameters.Add(p_studid); 

您可以使用任何這些方法只記得一件事...參數應始終在SQL的順序添加。當然,還必須照顧OracleDBType。

另請參閱DIS頁面如果萬一你有doubts- http://docs.oracle.com/cd/E17781_01/appdev.112/e18751/building_odp.htm

謝謝大家尤爾建議! :)