【问题标题】:How to fix: "Parameter index out of range (2 > number of parameters, which is 1)."如何解决:“参数索引超出范围(2 > 参数数量,即 1)。”
【发布时间】:2020-01-23 20:21:11
【问题描述】:

如果我尝试通过 Java (jdbc) 从 mySql 数据库中获取时间戳(日期对象),则会收到错误消息:“参数索引超出范围(2 > 参数数量,即 1)。”

我在互联网上找不到适合我的解决方案,因为(我认为)sql-query 是正确的,并且我放置了“?”的确切数量需要。

PreparedStatement st = conn.prepareStatement("SELECT * FROM timestamp WHERE stampTime BETWEEN '?/0/? 00:00:00.00' AND '?/31/? 23:59:59.999' AND userid = ? ");
            st.setInt(1, month);
            st.setInt(2, year); //It crashes here
            st.setInt(3, month);
            st.setInt(4, year);
            st.setInt(5, uId);
            ResultSet rs = st.executeQuery();

我希望该语句已准备好并执行,但我收到错误“参数索引超出范围(2 > 参数数量,即 1)。”

【问题讨论】:

  • 为什么不使用st.setDate()
  • ?/0/??/31/? 不是参数标志的有效使用。它只知道userid = ? 这就是st.setInt(2, year) 抛出Parameter index out of range 的原因。正如 Nexevis 所说,您可以使用完整的 Date 对象并将它们设置为以下查询的参数:SELECT * FROM timestamp WHERE stampTime BETWEEN ? AND ? AND userid = ?
  • 谢谢你解决了我的问题。 xtratic 祝你有美好的一天

标签: java mysql sql jdbc glassfish


【解决方案1】:

当问号? 是字符串文字的一部分时,它们不会被解释为参数指示符。这就是为什么'?/0/? 00:00:00.00''?/31/? 23:59:59.999' 中的问号不计入prepared statement 的参数;只有userid = ? 中的? 被计算在内,因为它是唯一一个“公开”的。

您可以通过在 Java 程序中构造范围的结束日期并将它们绑定到 stampTime BETWEEN ? AND ? 条件内的参数来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多