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;
}
}
这应该会将这些值更正到我的表中
# 1 楼答案
@Basil给出的答案是完全正确的,您必须阅读并理解它,才能获得如何构建和执行查询的基本概念
不过,在你的例子中,我可以在评论中看到你面临的
java.sql.SQLSyntaxErrorException: The number of values assigned is not the same as the number of specified or implied columns.
这背后的原因是您的格式错误的SQL具有额外的","
删除sql中的
"
、+
和其他格式,您将得到以下结果:SQL解析在第33行失败。在
student.isPassedTheory()
之后删除额外的+ "', '"
,您将能够执行查询。 在修复代码后,应该以以下查询格式结束# 2 楼答案
Desai的correct Answer在生成的SQL语句中发现了语法错误:错放逗号
下面是编写SQL的更好方法,这样您就可以自己发现此类错误
您应该始终将SQL作为一段文本单独构建,以便于调试此类问题
构建SQL文本,并检查
使用
StringBuilder
构建文本下面是示例代码。用对象getter方法填充
xxx
(我太懒了)然后打印出该值,以验证SQL是否正确。与other examples of SQL比较,找出你的boo-boo
我们将礼貌地忽略密码的保存,而不会对密码、许可证号码和出生日期进行盐析和哈希,因为这会带来很大的安全风险
顺便说一下,您应该将Java对象上的仅日期值(例如出生日期)表示为}&
LocalDate
对象。可怕的{SimpleDateFormat
类在几年前被java取代。时间课程。LocalDate.toString()
方法生成标准ISO 8601格式的文本,该格式仅适用于日期,与SQL中常用的格式相同准备好的声明
比上述更好的方法是使用带有占位符的准备好的语句。在执行生成的文本时,阅读起来更加复杂,更重要的是,这会使您面临SQL Injection攻击的风险
同样,打印出来并检查
创建一个
PreparedStatement
。在该对象上调用set…
方法# 3 楼答案
请注意,当您在SQL语句中添加错误语法时,也会发生这种情况,例如:
虽然报告的错误与原始问题相同,但这并不是列和提供的值不匹配,甚至没有逗号,而是您无意中输入的等号