【问题标题】:java.sql.sqlsyntaxerrorexception:comparison between numeric and char(ucs_basic) are not supportedjava.sql.sqlsyntaxerrorexception:不支持数字和字符(ucs_basic)之间的比较
【发布时间】:2017-07-16 12:57:42
【问题描述】:

我遇到了与数据库相关的问题。实际上,当我更新记录时,它显示异常“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 嵌入式数据库

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

谢谢

【问题讨论】:

  • 错误信息中有什么不明白的地方? (作为旁注,您应该阅读有关 sql 注入的内容)
  • 作为一个疯狂的猜测,我打赌 STUDENTID 是一个数字所以不是STUDENTID='"+tf_sid.getText()+"'
  • 其实我不擅长编程。使用哪种方法或如何解决?

标签: java database netbeans syntax-error derby


【解决方案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 的正确方法是在您的语句中使用参数标记占位符代替每个值,并使用适当的setIntsetStringsetDate 等方法在您准备好语句之后和调用executeUpdate之前提供实际值。

有关详细教程,请参阅此文档:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

【讨论】:

  • 抱歉回复晚了,您的信息现在可以帮助我运行代码
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2021-02-04
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多