有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Insert语句到Derby数据库中

我试图在我的JavaDerby数据库中的一个表中插入一些值,我得到的错误是java。sql。SQLSyntaxErrorException:VALUES子句必须至少包含一个元素。不允许使用空元素

    public boolean registerStudent(Student student)
    {
        try
        {
        Connection conn = DriverManager.getConnection("jdbc:derby://localhost:1527/AceDrivingSchool", "ADC", "ADC");
        Statement stmt = conn.createStatement();
        stmt.executeUpdate("INSERT INTO ADC.STUDENT(EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2,"
                + " POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB"
                + ") VALUES('" + student.getEmailAddress() +
                "', '" + student.getForename() + "', '" + student.getSurname() + 
                "', '" + student.getAddressLine1() + "', '" + student.getAddressLine2() + "', '" + student.getPostcode() + 
                "', '" + student.getTelephoneNo() + "', '" + student.getGender() + "', '" + student.getPassword() + 
                "', '" + student.isIsRegistered() + "', '" + student.isIsVerified() + "', '" + student.isPassedTheory() + "', '" +
                "', '" + student.isPassedPractical() + "', '" + student.getdrivingLicenseNo() + "', '" + 
                new SimpleDateFormat("yyyy-MM-dd").format(student.getDob()) + "')");   
        conn.close();
        return true;
        }
        catch(SQLException ex)
        {
            ex.printStackTrace();
            return false;
        }
    }

这应该会将这些值更正到我的表中


共 (3) 个答案

  1. # 1 楼答案

    @Basil给出的答案是完全正确的,您必须阅读并理解它,才能获得如何构建和执行查询的基本概念

    不过,在你的例子中,我可以在评论中看到你面临的java.sql.SQLSyntaxErrorException: The number of values assigned is not the same as the number of specified or implied columns. 这背后的原因是您的格式错误的SQL具有额外的","

    删除sql中的"+和其他格式,您将得到以下结果:

    INSERT INTO adc.student 
                ( 
                            emailaddress, 
                            forename, 
                            surname, 
                            addressline1, 
                            addressline2, 
                            postcode, 
                            telephoneno, 
                            gender, 
                            password, 
                            isregistered, 
                            isverified, 
                            passedtheory, 
                            passedpractical, 
                            drivinglicenseno, 
                            dob 
                ) 
                VALUES 
                ( 
                            student.Getemailaddress() , 
                            student.Getforename() , 
                            student.Getsurname() , 
                            student.Getaddressline1() , 
                            student.Getaddressline2() , 
                            student.Getpostcode() , 
                            student.Gettelephoneno() , 
                            student.Getgender() , 
                            student.Getpassword() , 
                            student.Isisregistered() , 
                            student.Isisverified() , 
                            student.Ispassedtheory() , 
                            , 
                            student.ispassedpractical() , 
                            student.getdrivinglicenseno() , 
                            NEW simpledateformat(yyyy-mm-dd).format(student.getdob()) 
                )
    

    SQL解析在第33行失败。在student.isPassedTheory()之后删除额外的+ "', '",您将能够执行查询。 在修复代码后,应该以以下查询格式结束

    "INSERT INTO ADC.STUDENT(EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2,"
                    + " POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB"
                    + ") VALUES('" + student.getEmailAddress() +
                    "', '" + student.getForename() + "', '" + student.getSurname() + 
                    "', '" + student.getAddressLine1() + "', '" + student.getAddressLine2() + "', '" + student.getPostcode() + 
                    "', '" + student.getTelephoneNo() + "', '" + student.getGender() + "', '" + student.getPassword() + 
                    "', '" + student.isIsRegistered() + "', '" + student.isIsVerified() + "', '" + student.isPassedTheory() +
                    "', '" + student.isPassedPractical() + "', '" + student.getdrivingLicenseNo() + "', '" + 
                    new SimpleDateFormat("yyyy-MM-dd").format(student.getDob()) + "')");   
    
  2. # 2 楼答案

    Desai的correct Answer在生成的SQL语句中发现了语法错误:错放逗号

    下面是编写SQL的更好方法,这样您就可以自己发现此类错误

    您应该始终将SQL作为一段文本单独构建,以便于调试此类问题

    构建SQL文本,并检查

    使用StringBuilder构建文本

    下面是示例代码。用对象getter方法填充xxx(我太懒了)

    StringBuilder sql = new StringBuilder() ;
    String eol = "\n" ;  // linefeed
    String comma = " , " ;  // SPACE + COMMA + SPACE
    sql.append( "INSERT INTO ADC.STUDENT ( " ).append( eol ) ;
    sql.append( "    EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2, POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB " ).append( eol) ;
    sql.append( ") VALUES (" ).append(eol) ;
    sql.append( student.getEmailAddress() ).append( comma ) ; // EMAILADDRESS
    sql.append( student.getForename()  ).append( comma ) ; // FORENAME
    sql.append( xxx ).append( comma ) ; // SURNAME
    sql.append( xxx ).append( comma ) ; // ADDRESSLINE1
    sql.append( xxx ).append( comma ) ; // ADDRESSLINE2
    sql.append( xxx ).append( comma ) ; // POSTCODE
    sql.append( xxx ).append( comma ) ; // TELEPHONENO
    sql.append( xxx ).append( comma ) ; // GENDER
    sql.append( xxx ).append( comma ) ; // PASSWORD
    sql.append( xxx ).append( comma ) ; // ISREGISTERED
    sql.append( xxx ).append( comma ) ; // ISVERIFIED
    sql.append( xxx ).append( comma ) ; // PASSEDTHEORY
    sql.append( xxx ).append( comma ) ; // PASSEDPRACTICAL
    sql.append( xxx ).append( comma ) ; // DRIVINGLICENSENO
    sql.append( xxx ) ; // DOB — IMPORTANT no comma on the last item. 
    sql.append( ") ;" ) ;
    

    然后打印出该值,以验证SQL是否正确。与other examples of SQL比较,找出你的boo-boo

    我们将礼貌地忽略密码的保存,而不会对密码、许可证号码和出生日期进行盐析和哈希,因为这会带来很大的安全风险

    顺便说一下,您应该将Java对象上的仅日期值(例如出生日期)表示为LocalDate对象。可怕的{}&SimpleDateFormat类在几年前被java取代。时间课程。LocalDate.toString()方法生成标准ISO 8601格式的文本,该格式仅适用于日期,与SQL中常用的格式相同

    准备好的声明

    比上述更好的方法是使用带有占位符的准备好的语句。在执行生成的文本时,阅读起来更加复杂,更重要的是,这会使您面临SQL Injection攻击的风险

    StringBuilder sql = new StringBuilder() ;
    String eol = "\n" ;  // linefeed
    sql.append( "INSERT INTO ADC.STUDENT ( " ).append( eol ) ;
    sql.append( "    EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2, POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB " ).append( eol) ;
    sql.append( ") VALUES (" ).append(eol) ;
    sql.append( "? , " ) ; // EMAILADDRESS
    sql.append( "? , " ) ; // FORENAME
    sql.append( "? , " ) ; // SURNAME
    sql.append( "? , " ) ; // ADDRESSLINE1
    sql.append( "? , " ) ; // ADDRESSLINE2
    sql.append( "? , " ) ; // POSTCODE
    sql.append( "? , " ) ; // TELEPHONENO
    sql.append( "? , " ) ; // GENDER
    sql.append( "? , " ) ; // PASSWORD
    sql.append( "? , " ) ; // ISREGISTERED
    sql.append( "? , " ) ; // ISVERIFIED
    sql.append( "? , " ) ; // PASSEDTHEORY
    sql.append( "? , " ) ; // PASSEDPRACTICAL
    sql.append( "? , " ) ; // DRIVINGLICENSENO
    sql.append( "? " ) ;   // DOB — IMPORTANT no comma on the last item. 
    sql.append( ") ; " ) ;
    

    同样,打印出来并检查

    String sqlOutput = sql.toString() ;
    System.out.println( sqlOutput ) ;
    

    创建一个PreparedStatement。在该对象上调用set…方法

    ps.setString( 1 , student.getEmailAddress() ) ;
    …
    ps.setObject( 15 , student.getDateOfBirth() ) ;  // Pass `LocalDate` object via `setObject` method using JDBC 4.2 or later.
    
  3. # 3 楼答案

    请注意,当您在SQL语句中添加错误语法时,也会发生这种情况,例如:

    INSERT INTO table ( a, b, c ) VALUES = ( 1, 2, 3 )
    

    虽然报告的错误与原始问题相同,但这并不是列和提供的值不匹配,甚至没有逗号,而是您无意中输入的等号