首页 > 解决方案 > 参数索引超出范围(4 > 参数个数,即 2)

问题描述

我正在制作一个简单的 java jdbc 程序,我必须在表上插入用户历史记录,但在那里有存货。这是我的代码

public void insertIntoHistory(ArrayList<QuestionAnswer> questionAnswer) throws Exception {
    try {
        conn.setAutoCommit(false);
        int maxId = getMaxSets() + 1;

        for (QuestionAnswer qa : questionAnswer) {
            String getSql = "INSERT INTO userhist(id, questionid, "
                    + "givenanswerid, isCorrect, questionSet) "
                    + "VALUES (NULL,?,?,?,?)";

            pst = conn.prepareStatement(getSql);
            pst.setInt(1, qa.getQuestionId());
            pst.setInt(2, qa.getAnswerId());
            pst.setBoolean(3, (isCorrect(qa.getQuestionId(), qa.getAnswerId())));
            pst.setInt(4, maxId);

            pst.executeUpdate();
        }

        conn.commit();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
        conn.rollback();
        throw e;
    }
}

错误是:

参数索引超出范围(4 > 参数数量,即 0)。java.sql.SQLException:参数索引超出范围(4 > 参数个数,即 0)。在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974 ) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919) 在 com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3813) 在 com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java: 3795) 在 com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3840) 在 com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:3784) 在 HistoryController.insertIntoHistory(HistoryController.java:

我认为问题来自这种方法

private boolean isCorrect(int questionId, int ansId) throws SQLException {
    String sql = "SELECT COUNT(*) AS Total FROM correctanswer where questionid = ? and answerid = ?";
    boolean isCorrect = false;

    try {
        pst = conn.prepareStatement(sql);
        pst.setInt(1, questionId);
        pst.setInt(2, ansId);

        ResultSet res = pst.executeQuery();
        int count = 0;
        if (res.next()) {
            count = res.getInt(1);
        }

        isCorrect = count > 1;

    } catch (SQLException e) {
        System.out.println(e.getMessage());
        throw e;
    }

    return isCorrect;
}

这是我的表结构 在此处输入图像描述

这里发生了什么请帮助我

标签: javamysqlsqljdbc

解决方案


问题可能源于您尝试将 aNULL插入id列中。由于它是自动增量非空,因此您应该假装它不存在以用于INSERT命令。


推荐阅读