2017-07-16 21 views
1

我遇到了與數據庫有關的問題。實際上,當我更新記錄時,它顯示異常「java.sql.sqlsyntaxerrorexception:numeric和char之間的比較(ucs_basic)不支持」 這裏是我的編碼:java.sql.sqlsyntaxerrorexception:不支持numeric和char(ucs_basic)之間的比較

conn = JavaConnectD.Connerdb(); 

    int p = JOptionPane.showConfirmDialog(null, "Do you really want to update this record", "UPDATE", JOptionPane.YES_NO_OPTION); 
    if(p==0){ 
    try{ 

     String sql="UPDATE SANDEEP.STUDENTRECORD SET REGTYPE='"+reg_type.getSelectedItem().toString()+"',SESSION='"+combo_session.getSelectedItem().toString()+"',STUDENTID='"+tf_sid.getText()+"',NAME='"+tf_name.getText()+"'," 
       + "CLASS='"+combo_class.getSelectedItem().toString()+"',FNAME='"+tf_fname.getText()+"',MNAME='"+tf_mname.getText()+"',DOB='"+(((JTextField)txt_Date.getDateEditor().getUiComponent()).getText())+"',ADDRESS='"+tf_adrss.getText()+"',MOBILE='"+tf_mobile.getText()+"',PHONE='"+tf_phone.getText()+"',REGFEE='"+tf_reg.getText()+"',ADDMISSION='"+tf_addmision.getText()+"' where STUDENTID='"+tf_sid.getText()+"' "; 
     pst=conn.prepareStatement(sql); 
     pst.executeUpdate(); 

     JOptionPane.showMessageDialog(null, "Record Updated"); 
     tf_sid.setText(""); 
     tf_name.setText(""); 
     tf_fname.setText(""); 
     tf_mname.setText(""); 
     tf_adrss.setText(""); 
     tf_mobile.setText(""); 
     tf_phone.setText(""); 
     tf_reg.setText(""); 
     tf_addmision.setText(""); 

    }catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    } 
    } 

我使用的NetBeans 7.1和德比嵌入式數據庫

,請告訴我,是我寫錯誤的。如果您需要任何其他信息,請隨時詢問。

謝謝

+0

什麼你不錯誤消息明白了嗎? (作爲一個方面說明,你應該閱讀關於SQL注入) – 2017-07-16 13:03:16

+1

作爲一個瘋狂的猜測,我敢打賭STUDENTID是一個數字,所以沒有'STUDENTID ='「+ tf_sid.getText()+」'' – 2017-07-16 13:04:38

+0

實際上我不擅長編程。哪種方法用於解決這個問題或如何解決? –

回答

1

您應該打印出你的sql可變權值初始化後,和之前你已經調用了它的prepareStatement方法。

你會看到它看起來像UPDATE SANDEEP.STUDENTRECORD SET REGTYPE='v1',SESSION='v2',STUDENTID='v3',NAME='v4',CLASS='v5',FNAME='v6',MNAME='v7',DOB='v8',ADDRESS='v9',MOBILE='v10',PHONE='v11',REGFEE='v12',ADDMISSION='v13' where STUDENTID='v14'

這是構造SQL語句有以下幾個原因一個尷尬的方式。

正如其他評論者所指出的那樣,它是不安全的,因爲攻擊者可以提供一個值,其中包含單引號的值,它將拋出整個語句並使其完全不同(這稱爲「SQL注入攻擊「

此外,更直接地與您的問題相關,您試圖爲您的UPDATE指定每個值作爲文字字符串,但似乎表中某些列的數據類型是不是字符串數據類型

可能有些列是INTEGERDATE等。對於這些列,您不希望提供字符串值,要提供數值或日期值等。

對於此工作使用java.sql.PreparedStatement的正確方法是在語句中使用參數標記佔位符,代替這些值中的每一個,並且在您準備好聲明之後並在致電executeUpdate之前,使用適當的setInt,setString,setDate等方法來提供實際值。

進行徹底的教程,請參閱本文件:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

+0

對於遲到的回覆感到抱歉,您的信息現在可以幫助我運行我的代碼 –