猿问

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

我停在需要弹出窗口通知用户他们的约会时间为 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。


慕森卡
浏览 115回答 2
2回答

冉冉说

PreparedStatement除了 Safeer Ansari 的回答之外,我将举例说明如何 PreparedStatement在这种情况下使用它以及为什么它会有利。对于LocalDateTime参数,请使用PreparedStatement::setObject.和可以这样重写Statement:StringConnection 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来完成这项工作。

狐的传说

错误在您的查询字符串中,因为ldt2之后没有结束单引号这是您的查询的样子:String query = "SELECT * FROM appointment WHERE start BETWEEN '" + ldt + "' AND '" + ldt2 + "'";此外,我建议将 String.format() 用于字符串格式化目的,而不是尝试连接如此复杂的字符串。我希望这能解决你的问题
随时随地看视频慕课网APP

相关分类

Java
我要回答