java.sql.sqlsyntaxerrorexception:不支持numeric和char(ucs_basic)之间的比较

时间:2017-07-16 12:57:42

标签: java database netbeans syntax-error derby

我遇到了与数据库相关的问题。实际上,当我更新记录时,它显示异常" java.sql.sqlsyntaxerrorexception:不支持数字和字符(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和derby嵌入式数据库

请告诉我写错了。如果您需要任何其他信息,请随时询问。

谢谢

1 个答案:

答案 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语句的一种尴尬方式。

正如其他评论者所指出的那样,它是不安全的,因为攻击者可以提供一个值,该值在值中包含单个引号,这会抛出整个语句并使其完全不同(这称为&#34 ; SQL注入攻击"。

此外,与您的问题更直接相关,您尝试将UPDATE的每个值指定为文字字符串,但似乎表中列的某些数据类型不是字符串数据类型。

可能您的某些列属于INTEGER类型或DATE类型等。对于这些列,您不想提供字符串值,您想要提供数值或日期值等。

使用java.sql.PreparedStatement进行此项工作的正确方法是在语句中使用参数标记占位符代替每个值,并使用相应的setIntsetString,在准备好陈述之后和致电setDate之前,executeUpdate等提供实际值的方法。

请参阅此文档以获取详尽的教程:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html