将语句插入Derby数据库

时间:2019-05-27 20:41:07

标签: java sql database derby

我试图在我的Java derby数据库的表中插入许多值,但出现错误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 个答案:

答案 0 :(得分:2)

@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()) + "')");   

答案 1 :(得分:1)

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

这是编写SQL的更好方法,因此您可以自己发现这种错误。

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

建立您的SQL文本,然后检查

使用StringBuilder构建文本。

这是示例代码。您使用对象获取方法填充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进行比较以发现您的嘘声。

我们将礼貌地忽略密码的保存,而不会增加盐分和哈希值,许可证编号和出生日期,因为这会带来很大的安全风险。

顺便说一句,您应该将Java对象上的仅日期值(例如出生日期)表示为LocalDate对象。可怕的DateSimpleDateFormat类在几年前被 java.time 类所取代。 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.

答案 2 :(得分:0)

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

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

尽管报告的错误与原始问题相同,但不是列和提供的值不匹配,甚至不是错错的逗号,而是您不加注意地输入的等号。