【问题标题】:Execution of PreparedStatement select failsPreparedStatement 选择执行失败
【发布时间】: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

标签: java sql sqlite jdbc prepared-statement


【解决方案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 文档)。
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2019-04-17
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多