Java 和 Access - 使用 Prepared Statement 并获取日期
Posted
技术标签:
【中文标题】Java 和 Access - 使用 Prepared Statement 并获取日期【英文标题】:Java and Access - use Prepared Statement and get date 【发布时间】:2019-02-18 11:32:00 【问题描述】:我正在使用 MS Access 2007 数据库做一个 JavaAFX 应用程序。我需要在日期之后通过过滤从数据库中提取数据。
这个作品不错:
ResultSet rs = stat.executeQuery("SELECT * FROM Notification WHERE
postDate>=#2018-01-18# AND getDate<=#2019-02-18#");
但这不是:
private final static String GET_ALL =
"SELECT * FROM Notification WHERE postDate>=? AND getDate<=?";
public ArrayList<Notification> getAllNotification(LocalDate postDate, LocalDate getDate)
PreparedStatement prepStmt = conn.prepareStatement(GET_ALL);
prepStmt.setDate(1, java.sql.Date.valueOf(postDate));
prepStmt.setDate(2, java.sql.Date.valueOf(getDate));
ResultSet rs = prepStmt.executeQuery();
我做错了什么或没有做什么。 我当然使用的是 4.0.3 版中的 ucanaccess 库。有什么建议或提示吗?
【问题讨论】:
你得到什么错误? 您是收到错误消息还是只是收到与预期不同的结果?java.sql.Date
设计不佳且早已过时。我不记得 UCanAccess 从哪个版本支持 LocalDate
和 java.time, the modern Java date and time API 的其他类型。如果你可以的话,你显然应该更喜欢使用“LocalDate”。 :-)
【参考方案1】:
在 MS Access 中,日期“#”用作标识符。您必须在每个日期的开始和结束时明确指定 #。你可以试试这个,它应该可以工作。
"SELECT * FROM Notification WHERE postDate>= #?# AND getDate<= #?#";
为此,我将使用以下语法。
private String GET_ALL = "";
public ArrayList<Notification> getAllNotification(LocalDate postDate, LocalDate getDate)
GET_ALL = "Select * FROM Notification WHERE postDate >= #" + postDate + "# AND getDate <= #" + getDate + "#";
PreparedStatement prepStmt = conn.prepareStatement(GET_ALL);
ResultSet rs = prepStmt.executeQuery();
【讨论】:
我也不确定您是否可以将参数插入到已标记为“最终”的语句中。请也检查一下。 不幸的是“UCAExc:::4.0.3 unknown token:”你可以,所有其他指令作为最终工作正常。 尝试在方法 "SELECT * FROM Notification WHERE postDate>= #" + postDate + "# AND getDate 是的,这很好,我试试看,但我可以尝试使用类 PreparedStatement :) "我也不确定您是否可以将参数插入到已标记为'final'的语句中"。我假设您指的是private static final String GET_ALL = ...;
中的final
关键字。这个final
的存在与PreparedStatement
无关。它所做的只是说不能重新分配GET_ALL
变量。 PreparedStatement
不会,也不能重新分配变量,因为 Java 是按值传递的;此外,String
是不可变的。以上是关于Java 和 Access - 使用 Prepared Statement 并获取日期的主要内容,如果未能解决你的问题,请参考以下文章
PreparedStatement 最大查询,参数未在 Java 中执行