为了账号安全,请及时绑定邮箱和手机立即绑定

我有一个约会安排应用程序,我正在尝试创建

我有一个约会安排应用程序,我正在尝试创建

慕森卡 2023-05-10 15:17:38
我停在需要弹出窗口通知用户他们的约会时间为 15 分钟的地方。当我运行代码时,出现 sql 错误。任何帮助表示赞赏。我已经用实时代替了变量,它工作正常。当我将变量放回原处时,出现下面列出的错误。public static Appt apptIn15Min() {Appt appointment;LocalDateTime now = LocalDateTime.now();ZoneId zid = ZoneId.systemDefault();ZonedDateTime zdt = now.atZone(zid);LocalDateTime ldt = zdt.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();LocalDateTime ldt2 = ldt.plusMinutes(15);String user = UserDB.getCurrentUser();System.out.println(ldt);System.out.println(ldt2);System.out.println(user);try {    Statement statement = DBConnection.getConnection().createStatement();    String query = "SELECT * FROM appointment WHERE start BETWEEN '" + ldt + "' AND '" + ldt2;    ResultSet results = statement.executeQuery(query);    System.out.println(query);    System.out.println("Lookup started");    if(results.next()) {        appointment = new Appt(results.getInt("aptId"), results.getInt("customerId"), results.getString("start"),            results.getString("end"), results.getString("contact"), results.getString("type"),            results.getString("location"), results.getString("contact"));        System.out.println("Lookup Completed");        return appointment;    }} catch (SQLException e) {    System.out.println("SQLException: " + e.getMessage());}错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本对应的手册,以了解在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl 的第 1 行的 ''2019-07-29T21:59:28.709' 附近使用的正确语法.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 com.mysql.jdbc.Util。 handleNewInstance(Util.java:425) 在 com.mysql.jdbc.Util.getInstance(Util.java:408) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944) 在 com.mysql.jdbc.MysqlIO .checkErrorPacket(MysqlIO.java:3978) 在 com.mysql.jdbc.MysqlIO。
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

PreparedStatement

除了 Safeer Ansari 的回答之外,我将举例说明如何 PreparedStatement在这种情况下使用它以及为什么它会有利。

对于LocalDateTime参数,请使用PreparedStatement::setObject.

和可以这样重写StatementString

Connection con = DBConnection.getConnection();

String query = "SELECT * FROM appointment WHERE start BETWEEN ? AND ? ;";

PreparedStatement statement = con.prepareStatement(query)

statement.setObject(1,ldt);

statement.setObject(2,ldt2);

ResultSet rs = statement.executeQuery();

请注意如何构建String query语句不再需要任何String串联,而是使用?as 位置来设置变量。使用动态查询时使用PreparedStatementover没有任何缺点。Statement

注意: 我没有包括任何关闭资源或exception处理以保持示例简单。使用try-with-resources来完成这项工作。


查看完整回答
反对 回复 2023-05-10
?
狐的传说

TA贡献1804条经验 获得超3个赞

错误在您的查询字符串中,因为ldt2之后没有结束单引号

这是您的查询的样子:

String query = "SELECT * FROM appointment WHERE start BETWEEN '" + ldt + "' AND '" + ldt2 + "'";

此外,我建议将 String.format() 用于字符串格式化目的,而不是尝试连接如此复杂的字符串。

我希望这能解决你的问题


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信