PreparedStatement 选择执行失败

Posted

技术标签:

【中文标题】PreparedStatement 选择执行失败【英文标题】:Execution of PreparedStatement select fails 【发布时间】:2015-06-10 09:52:22 【问题描述】:

我正在尝试使用preparedStatements 从表IsSELECTED 中选择一条记录。我的表有 3 个字段(日期(DATETIME)、早上(BOOL)、中午(BOOL)、晚上(BOOL))和一个包含这些值的记录(2013-12-12、0、0、0)。我的方法尝试选择具有给定日期的记录。

     public void getTodayInfo(HttpSession session, String date) 
        throws ClassNotFoundException, SQLException
    System.out.println("flag1"); 
    String sq = "SELECT date, morning, noon, night FROM IsSELECTED WHERE date='?'";

    try        
        System.out.println("flag2");
        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection(path);            
        stm = c.prepareStatement(sq);
        stm.setString(1, date);            
        System.out.println("flag3");
        ResultSet rs = stm.executeQuery(sq);
        while (rs.next()) 
            System.out.println("flag4");
            Shift s = new Shift(rs.getString(date), rs.getBoolean("morning"), rs.getBoolean("noon"), rs.getBoolean("night"));
            System.out.println("flag5" + s.toString());
            session.setAttribute("shiftsToday", s);
        
     catch (SQLException e) 
        System.out.println(e.getMessage());
     finally 
        if (stm != null)
            stm.close();
        if (c != null)
    c.close();
    

    System.out.println("Goodbye!");

   

然后什么也没有发生。我放了一些System.out.println 看看我哪里有问题,我得到了这个

flag1 
flag2

假设它与任何记录都不匹配(但无论如何我看到我的表有这条记录)为什么不打印flag3

【问题讨论】:

SQLException 更改为 Exception 看看会发生什么。你确定没有抛出异常吗? Goodbye 打印出来了吗? 日期=trunc(?);如果您的列是 Date 类型,您还必须使用 rs.getDate。 我想应该是getString("date") 您能否停止使用 [servlets] 而不是 [jdbc] 标记 JDBC 问题?这不是你第一次犯这个史诗般的错误。作为设计提示,您应该将 servlet 类之外的所有 JDBC 代码移动到可重用的 DAO 类中,然后您可以使用带有 main() 方法的 Java 应用程序类轻松测试该类,最终只需在您的 servlet 类中导入/调用。 好的,我会记住的.. thx 【参考方案1】:

您无需在? 周围包含',只需使用date = ?

同时使用:

ResultSet rs = stm.executeQuery();

而不是

ResultSet rs = stm.executeQuery(sq);

【讨论】:

然后我收到这条日志消息flag1 flag2 flag3 not implemented by SQLite JDBC driver Goodbye! 为什么日期是字符串?你不想设置日期吗?这不是写得很好的代码。如果您在 catch 块中打印堆栈跟踪,您将从系统中获得更多信息。作为 SQL 关键字的表名和列名(例如“日期”)正在自找麻烦。尝试重命名为“shiftDate”。 如果要将日期作为String传递,则必须使用SQL的to_date函数进行转换,类型必须相同! 好的!我对此有点困惑..我会阅读它以清除这些东西。【参考方案2】:

从您的查询中删除? 周围的'

String sq = "SELECT date, morning, noon, night FROM IsSELECTED WHERE date=?";

执行时无需再次传递查询。

ResultSet rs = stm.executeQuery();

还包括"rs.getString(date) 中的日期前后

Shift s = new Shift(rs.getString("date"), rs.getBoolean("morning"), rs.getBoolean("noon"), rs.getBoolean("night"));

注意:如果日期是数据库中的日期字段,那么你应该使用setDate,getDate方法。

【讨论】:

将查询传递给PreparedStatement 中的executeQuery 应该会触发SQLException(请参阅API 文档)。

以上是关于PreparedStatement 选择执行失败的主要内容,如果未能解决你的问题,请参考以下文章

PreparedStatement和Statement

JDBC——PreparedStatement执行SQL的对象

Java JDBC PreparedStatement 外键约束失败

将参数传递给 JDBC PreparedStatement

PreparedStatement执行sql語句

“?”附近的 MySQLSyntaxErrorException尝试执行 PreparedStatement 时