【问题标题】:Java Sql Database Parameter Index out of rangeJava Sql 数据库参数索引超出范围
【发布时间】:2014-01-22 17:21:03
【问题描述】:

您好,我正在尝试插入数据库,但出现错误:

 SQL Exception: java.sql.SQLException: Parameter index out of range (6 > number of parameters, which is 5).

造成这种情况的代码是:

 PreparedStatement st = connection.prepareStatement("INSERT INTO Members VALUES  ('?','?','?','?','?','?','?','?','?','?','?','?','?','?'','?','?','?','?','?'");
        st.setString(1, username);
        st.setString(2, id);
        st.setString(3, firstName);
        st.setString(4, lastName);
        st.setString(5, address);
        st.setString(6, phone);
        st.setString(7, email);
        st.setInt(8, age);
        st.setString(9, String.valueOf(sex));
        st.setDouble(10, height);
        st.setInt(11, kgs);
        st.setDouble(12, stone);
        st.setInt(13, targetWeightKgs);
        st.setDouble(14, bmi);
        st.setString(15, medicalHistory);
        st.setString(16, extraHistory);
        st.setBoolean(17, smoker);
        st.setBoolean(18, usernameCompleted);
        st.setString(19, myNotes);
        st.executeUpdate();

【问题讨论】:

  • 可以显示数据库表吗?

标签: java mysql sql jdbc


【解决方案1】:

您不应引用 ? 占位符,即使它们代表字符串数据。引用的问号将被解释为文字 '?' 字符串。它可能被解释为 5 个参数,因为您的倒数第 6 个参数有两个 ' 字符,因此您的最后 5 个 ?s 被解释为单引号之外。

试试

connection.prepareStatement("INSERT INTO Members VALUES
   (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

更新

插入语句中缺少一个结束“)”,我现在已经添加了。

【讨论】:

  • 使用 prepareStatement 很棒,但肯定有更好的方法来创建更复杂的 prepareStatement,比如这个。我的意思是使用 15x '?只是不可行...
  • @i-bob 你的评论没有多大意义。为什么要创建一个比这个更复杂的PreparedStatement?问题中没有任何内容表明需要任何更复杂的东西,或者这需要执行 15 次,尽管 PreparedStatement 无论如何都是要走的路。
  • 我的意思是,这当然是这个问题的有效答案,我只是问如何以更好的方式做到这一点,如果有人知道如何与我们分享......我的意思是使用诸如 DAO 之类的东西......
  • @i-bob 如果您对您的代码有一个特定的问题,以及使用带有PreparedStatement 的 DAO 的更好方法,那么您可以随时将其作为另一个问题提出。
  • 这绝不是对您的解决方案的批评,只是对其他选项的简单好奇...... :)
【解决方案2】:

您不需要在? 周围加上'

PreparedStatement st = connection.prepareStatement("INSERT INTO Members VALUES  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?");

BUT 真正的问题是您将? 中的一个双引号单引号看起来像:'?'',

【讨论】:

    【解决方案3】:

    您的示例代码中存在错误

    preparedStatement如果您在原始代码中犯了同样的错误,那么它将无法正常工作!

    查看问号和'你不需要'

    【讨论】:

      【解决方案4】:

      替换“?”经过 ?

      INSERT INTO Members VALUES  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-08
        • 2014-06-06
        • 1970-01-01
        • 2019-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多