Индекс параметра вне диапазона (4> количество параметров, которое равно 2) - PullRequest
0 голосов
/ 25 октября 2019

Я делаю простую 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.SQLErLEr.SQ) по адресу com.mysql.jdbc.SQLError.createSQLException (SQLError.java:919) по адресу com.mysql.jdbc.PreparedStatement.checkBounds (PreparedStatement.java:3813) по адресу com.mysql.jdbc.PreparedSmentjIn::3795) в com.mysql.jdbc.PreparedStatement.setInternal (PreparedStatement.java:3840) в com.mysql.jdbc.PreparedStatement.setInt (PreparedStatement.java:3784) в HistoryController.insertIntoHistory (HistoryConthoses). jButton2ActionPerformed (MultipleChoiseQuestion.java:223) в MultipleChoiseQuestion.access $ 700 (MultipleChoiseQuestion.java:20) в MultipleChoiseQuestion $ 7.actionPerformed (MultipleChoiseQuestion.java:141)swing.AbstractButton $ Handler.actionPerformed (AbstractButton.java:2348) по адресу javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:402) по адресу javax.swing.DefaultButtonModel.setPressed (DefaultButtonModel.java:259) по адресу javax.swing.plaerButtonBase. .java: 252) в java.awt.Component.processMouseEvent (Component.java:6533) в javax.swing.JComponent.processMouseEvent (JComponent.java:3324) в java.awt.Component.processEvent (Component.java:6298). в java.awt.Container.processEvent (Container.java:2237) в java.awt.Component.dispatchEventImpl (Component.java:4889) в java.awt.Container.dispatchEventImpl (Container.java:2295) в java.awt. Component.dispatchEvent (Component.java:4711) в java.awt.LightweightDispatcher.retargetMouseEvent (Container.java:4889) в java.awt.LightweightDispatcher.processMouseEvent (Container.java:4526) в java.awt.Lightweightispatch.java: 4467) в java.awt.Container.dispatchEventImpl (Container.java:2281) в java.awt.Component.dispatchEvent (Component.java:4711) в java.awt.EventQueue.dispatchEventImpl (EventQueue.java:758) в java.awt.EventQueue.access $ 500 (EventQueue.java:97) в java.awt.EventQueue $ 3.run (EventQueue.java: 709) в java.awt.EventQueue $ 3.run (EventQueue.java:703) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDo) .java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:90) в java.awt.EventQueue $ 4.run (EventQueue.java:731) в java.awt.EventQueue $ 4.run (EventQueue.java:729)security.AccessController. EventDispatchThread.java:201) в java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:116)в java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:105) в java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:101) в java.awt.EventDispatchThread.pava.tmp (93) .jpgEventDispatchThread.run (EventDispatchThread.java:82) BUILD SUCCESSFUL (общее время: 6 секунд)

Я думаю, что проблема возникла из-за этого метода

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;
}

это моя структура таблицы enter image description here

Что здесь происходит, пожалуйста, помогите мне

1 Ответ

0 голосов
/ 25 октября 2019

Возможно, проблема в том, что вы пытаетесь вставить NULL в столбец id. Так как это автоинкремент not-null, вы должны сделать вид, что он не существует для команд INSERT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...