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 并获取日期的主要内容,如果未能解决你的问题,请参考以下文章

JAVA- JDBC之DBHelper

PreparedStatement 最大查询,参数未在 Java 中执行

java代码调用数据库存储过程

Java 和 Access - 使用 Prepared Statement 并获取日期

JDBCJava 数据库连接基础实践

使用 Java Ucanaccess 在 ms-Access 中恢复数据和存储的查询