我试图在我的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;
}
}
这应该使值适合我的表
答案 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作为文本单独构建,以方便调试此类问题。
使用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
对象。可怕的Date
和SimpleDateFormat
类在几年前被 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 )
尽管报告的错误与原始问题相同,但不是列和提供的值不匹配,甚至不是错错的逗号,而是您不加注意地输入的等号。