【问题标题】:Issue With Cycling Through Entries In Database循环通过数据库中的条目的问题
【发布时间】:2018-05-07 21:48:06
【问题描述】:

我正在尝试使用 Java 浏览我的 Access 数据库,以检查日期范围是否介于另一个日期范围之间以避免重复预订。我遇到了一个 SQL 错误,上面写着“ResultSet is Closed”。我相信这是因为我使用了两个 resultSet 来通过一个 while 循环检查两个不同的日期。代码如下:

String date1Query = "SELECT checkIn FROM Reservation WHERE roomLocation LIKE '" + room + "'";
String date2Query = "SELECT checkOut FROM Reservation WHERE roomLocation LIKE '" + room + "'";

ResultSet date1RS = statement.executeQuery(date1Query);
ResultSet date2RS = statement.executeQuery(date2Query);
    while (date1RS.next()) {
        date1 = date1RS.getDate("checkIn");
        date2 = date2RS.getDate("checkOut");
        dateCheckBool = dateCheck.dateCheck(date1, date2, checkIn, checkOut);    

        if (dateCheckBool == true)
            break;
    }

我还能如何格式化它以实现相同的功能(能够根据数据库中现有的日期检查用户的输入日期)但不会出错?如果这还不够清楚我要做什么,我会根据要求进一步澄清。谢谢!

编辑:这里要求的是 dateCheck 代码:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class dateCheck {
    public boolean dateCheck(Date date1, Date date2, String date3, String 
date4){
    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
    Date dateCheck1;
    Date dateCheck2;
    boolean dateRange1 = false;
    boolean dateRange2 = false;
    try {
        dateCheck1 = dateFormat.parse(date3);
        dateCheck2 = dateFormat.parse(date4);

        if(dateCheck1.before(date1) || dateCheck1.after(date2))
            dateRange1 = false;
        else
            dateRange1 = true;
        if(dateCheck2.after(date2))
            dateRange2 = false;
        else
            dateRange2 = true;
    } catch (ParseException e) {
        e.printStackTrace();
    }
    if(dateRange1 == false && dateRange2 == false)
        return false;
    else
        return true;
    }
}

【问题讨论】:

  • 可以分享dateCheck的代码吗?它应该做什么?
  • @Mureinik 我添加了它,它将字符串解析为日期,然后将它们与数据库中已包含的日期进行比较

标签: java sql ms-access resultset


【解决方案1】:

当只有 SQL 可以给你结果时,为什么还要摆弄?

如果您想知道预订是否已经到位,只需询问数据库即可。

 SELECT id as result From reservations
 Where (
        ([RoomLocation] like ?)
        And (
            (? between [checkin] and [checkout])
            OR (? between [checkin] and [checkout])
        ) 
);

在你的 java 中:

statement.setString(1,room);
statement.setDate(2,date1);
statement.setDate(3,date2);

..执行..

如果有任何预订,您将收到预订 ID。如果不为空。您也可以将上面的 SQL 放在另一个 select 命令中并返回 true 或 false 值。 如果您遇到日期格式不兼容的问题,您可能需要格式化日期并将其作为字符串传递。

Ps:手机回复,请仔细检查 SQL 是否有错别字。

【讨论】:

  • 我试试这个,不知道SQL有这个功能!我对它很陌生。如何将其放入另一个选择命令以返回真/假值?
猜你喜欢
  • 2015-08-10
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多