Проблемы с чтением строки SQL с помощью java

Я работаю над Java-программой с базой данных sql, которая представляет собой покемон. У меня проблемы с помещением строки базы данных в массив. Вот часть моего кода, которая вызывает проблему.

String query2 = "SELECT * " + 
                  "FROM Pokedex.typea, Pokedex.Pokemon where Pokemon.ID = " + pk +
                  " AND type1 = type_name";

java.sql.Statement st2 = con.createStatement();   
ResultSet rs2 = st2.executeQuery(query2);

int i = 2
    while(rs2.next() && i<19) {
        weaka[i-2] = rs2.getInt(i);
        System.out.println(weaka[i-2]);
        i++;
    }

и вот строка, которую возвращает query2 (я тестировал это с помощью mysql workbench):

Fire    1   0   0   0   1   0   1   0   0   1   -1  1   0   0   0   -1  1   -1  4   Charmander  39  52  43  60  50  65  309 Fire    null    Blaze   null    Solar Power NULL

Я надеялся, что этот код поместит значения из столбцов со 2 по 18 в массив "weaka", но весь код постоянно выполняет

weaka[i-2] = rs2.getInt(i);
System.out.println(weaka[i-2]);

но он никогда не увеличивает i, никогда не читает содержимое любого другого столбца и никогда не заканчивается. Программа просто печатает «1» пару сотен раз, а затем вылетает. Почему i не повторяется?

Может ли кто-нибудь помочь мне выяснить, как заставить мой код спуститься по строке и прочитать содержимое столбцов со 2 по 18 в массиве? Спасибо

Обновлено: Спасибо за оба ответа. Они оба работали, чтобы заставить массив считывать строку, но процесс все равно продолжается дольше, чем следовало бы, с обоими ответами. это как будто он читает строку несколько раз. Код, который я вам дал, не был в цикле, так почему он читает строку несколько раз?

также Pokemon.ID - это первичный ключ моей схемы, поэтому запрос вернет только одну строку.

Попробуйте использовать отладчик. Цикл while из ответов может обрабатывать более одной строки, только если SQL-запрос возвращает более одной строки из базы данных.

Ivan 01.05.2018 20:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
106
1

Ответы 1

Метод ResultSet.next() пытается прочитать строка из набора результатов и возвращает true, если это удается. Что ты делаешь:

while(rs2.next() && i<19) {
    weaka[i-2] = rs2.getInt(i);
    System.out.println(weaka[i-2]);
    i++;
}

читает строку, помещает первое значение в массив и читает следующую строку. Но следующей строки нет, поэтому выполнение останавливается тут же.

Вместо этого сделайте следующее:

if (rs2.next()) {
    for (int i=2; i < 19; i++){
        weaka[i-2] = rs2.getInt(i);
        System.out.println(weaka[i-2]);
    }
}

Если вам нужно прочитать более одной строки, вам тоже придется с этим справиться.

Что произойдет, если ResultSet имеет несколько строк?

Amit Bera 01.05.2018 19:01

Как я уже упоминал, с этим нужно разобраться. Но, судя по названиям полей типа ID и переменных pk, я предполагаю, что это первичный ключ. Мой пример служит для объяснения того, как следует использовать ResultSet.next().

SeverityOne 01.05.2018 19:19

Другие вопросы по теме