执行PreparedStatement选择失败

时间:2015-06-10 09:52:23

标签: java sql sqlite jdbc prepared-statement

我正在尝试使用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

2 个答案:

答案 0 :(得分:5)

您不需要在'周围加?,只使用date = ?

也可以使用:

ResultSet rs = stm.executeQuery();

而不是

ResultSet rs = stm.executeQuery(sq);

答案 1 :(得分: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方法。