Я делаю простую 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;
}
это моя структура таблицы
Что здесь происходит, пожалуйста, помогите мне