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 选择执行失败的主要内容,如果未能解决你的问题,请参考以下文章
JDBC——PreparedStatement执行SQL的对象