当前位置: 首页 > 知识库问答 >
问题:

我正在尝试创建一个约会计划应用程序

雷骁
2023-03-14

我停在一个点上,我需要弹出一个窗口,通知用户他们的约会在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());
}

共有2个答案

祁博涛
2023-03-14

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

您的查询应该是这样的:

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

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

我希望这能解决你的问题

长孙景焕
2023-03-14

除了Safeer ansari的回答之外,我还将举一个例子来说明如何在这个场景中使用PREared语句以及为什么它是有利的。

对于LocalDateTime参数,使用准备声明::setObject

语句和字符串可以这样重写:

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();

请注意,构建字符串查询语句不再需要任何字符串连接,而是使用字符串连接 作为设置变量的位置。使用动态查询时,在语句上方使用PreparedStatement没有任何缺点。

注意:为了保持示例的简单性,我没有包括任何关闭资源或异常处理。使用try with资源完成这项工作。

 类似资料:
  • 我正在RHEL原子主机上尝试OO。我按照本指南将OO master作为容器旋转https://docs.openshift.org/latest/getting_started/administrators.html 将shell附加到主容器后,我无法部署应用程序。 主机需要代理才能访问互联网。我已经在 /etc/sysconfig/docker 中配置了代理,这就是我可以在同一位置拉取源映像的方

  • 我试着创建这个过程(作为一个系统),它需要两个参数,用户名和密码,并根据它们创建一个用户: 问题是,当我尝试执行此过程(作为一个系统)时,我遇到了以下错误: 错误报告:ORA-01031:权限不足ORA-06512:在第9行的“系统.过程\u创建\u客户端”处ORA-06512:在第1 01031行。00000-“权限不足”*原因:试图在没有适当权限的情况下更改当前用户名或密码。如果试图在没有必要

  • 然后,该函数将使用API将一个json对象发送到数据库中,但似乎Volley.new请求队列(this);是一个空值。java.lang.NullPointerExcture:尝试在com.example.kevin.barcodescanner.addToCart.jsonParse的空对象引用上调用虚拟方法com.android.volley.请求com.android.volley.请求ue

  • 我编写了一个包含子类的应用程序,该子类将根据用户输入的边数掷骰子,并使用整数将掷骰子一定次数。 如:用户输入6面,想掷骰子1000次。 我还应该使用一个和我编码的数组相似的数组。 我目前拥有的: 然后,计算器将运行程序并根据程序运行的次数输出百分比,从而...所以像这样... 所需输出: 当前输出:现在我得到的都是返回的相同值,因为我现在用' for '循环所做的都是重复' sum ',不管掷骰子

  • 问题内容: 我一直在尝试使用Java(不是Android)和Firebase进行简单用户身份验证。在开始使用Firebase的用户身份验证类之前,我曾尝试使用Java进行简单的保存并在Firebase参考上检索,但没有成功。没有报告错误,但是Firebase中没有任何反应(数据没有更改)。过去,我能够将Firebase与Android SDK完美集成。我正在将Firebase JAR用于JVM,但

  • 我想从命令行在jmeter中创建一个测试计划。如何创建一个。命令行中的jmx文件? 我使用以下命令创建了一个: 文件创建成功。但是,当我输入下面显示的命令时,它会要求我提供一个脚本。jmx扩展: 我已经在网上搜索过了,我只找到了如何从命令行使用jeter运行testplan。但是我想先从命令行创建测试计划。有可能吗? 我的Java版本是1.8。0_77和Java(TM)SE运行时环境(构建1.8。