Недопустимый аргумент в вызове JDBC: индекс параметра выходит за пределы диапазона (при использовании Ucanaccess) - PullRequest
0 голосов
/ 22 июня 2019

Я создаю игру, которая содержит систему выравнивания из Java. До сих пор я использовал Ucanaccess для чтения текущего уровня и опыта пользователя (0-100).

Я пишу код, в котором используется оператор if, утверждающий, что когда уровень опыта пользователя на уровне 100 или выше 100, он выберет текущий уровень пользователя и повысит уровень на один уровень, а также вычтет дополнительный Очки опыта свыше 100 и переход на новый уровень. (Если exp = 129, новый exp = 129-100).

Вот мой код с оператором if:

if (exp >= 100)
{
    try
    {
        Connection conn = DriverManager.getConnection("jdbc:ucanaccess://C:\\Users\\evanc\\Documents\\NetBeansProjects\\IT PAT task\\IT PAT DataBase\\userDB.accdb");
        String query = "SELECT * FROM [tblUser] WHERE username = " + "'" + User.getInstance().username + "'";
        PreparedStatement pst = conn.prepareStatement(query);
        ResultSet rs = pst.executeQuery();
        rs.next();
        String newLevel = Integer.toString(User.getInstance().level + 1) ;
        String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";

        PreparedStatement st = conn.prepareStatement(updateQuery);
        st.setString(5,newLevel);
        st.executeUpdate();
        lblLevel.setText("lvl: " + Integer.toString(User.getInstance().level));

        int newExp = exp - 100;
        exp = newExp;
        exp = User.getInstance().experience;
        expBar.setValue(User.getInstance().experience);    
    }
    catch(Exception e)
    {
        System.err.println("Exception occured: ");
        System.err.println(e.getMessage());   
    }

    JOptionPane.showMessageDialog(null, "Congratulations! You leveled up!");
}

А вот ошибка, которую она показала: «Исключение произошло: UCAExc ::: 4.0.4 Недопустимый аргумент в вызове JDBC: индекс параметра вне диапазона: 5 "

Я пытаюсь обновить 5-й столбец моей базы данных, который называется "уровень".

Буду благодарен за любую помощь!

1 Ответ

0 голосов
/ 23 июня 2019

Во-первых: у вас есть лишний } в коде, я отредактировал ваш вопрос и удалил его.

Во-вторых, реальный вопрос.

Ваш запрос:

String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";

И тогда вы готовите это:

PreparedStatement st = conn.prepareStatement(updateQuery);

Итак, после подготовки у объекта st есть 1 доступный аргумент. Значение, которое заменит отметку ? в запросе. st не знает, что замена ? на самом деле является 5-м элементом в базе данных. С этой точки зрения, есть только 1 аргумент, который он ожидает.

Если вы хотите установить значение ? в запросе, то это поле № 1. Итак, ваш код должен быть:

st.setString(1,newLevel);

Смотрите эту страницу: https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html Он показывает вам пример подготовленного заявления с более чем одним ?. Вы увидите два ? в запросе. Поэтому они должны установить значения 1 и 2.


Еще один момент, я не понимаю, почему вы берете (уровень + 1) и конвертируете его в строку. Вы можете использовать st.setInt(1, newLevel) и хранить все цифры. Ваш звонок. Просто убедитесь, что тип данных поля в базе данных также является целым числом.

...