Проблема с SQL, ResultSet в Java - PullRequest
       21

Проблема с SQL, ResultSet в Java

5 голосов
/ 30 марта 2010

Как я могу повторить ResultSet? Я попытался с помощью следующего кода, но я получаю ошибку java.sql.SQLException: недопустимая операция с пустым набором результатов.

 while ( !rs.isLast()) {
     rs.next();
     int id = rs.getInt("person_id");
     SQL.getInstance().getSt().execute("INSERT ref_person_pub(person_id) VALUES(" + id + ")");
}

Обновление: я обнаружил проблему. Я использовал только одно утверждение из SQL-синглтона. Когда оператор закрыт, его нельзя использовать снова.

Ответы [ 2 ]

11 голосов
/ 30 марта 2010

Согласно учебному пособию по JDBC :

resultSet = statement.executeQuery();
while (resultSet.next()) { 
    int id = resultSet.getInt("id");
    // ...
}

ResultSet#next() перемещает курсор вперед на одну строку от его текущей позиции и возвращает true, если новая текущая строка действительна. Таким образом, цикл while автоматически останавливается, когда строк больше нет.

Если предполагается, что вместо нескольких строк будет возвращаться ноль или одна строка, вместо этого используйте if вместо:

resultSet = statement.executeQuery();
if (resultSet.next()) { 
    int id = resultSet.getInt("id");
    // ...
}

Таким образом, у вас есть возможность добавить else.

Обновление , в котором говорится и не имеет отношения к реальной проблеме, я вижу больше потенциальных проблем в вашем коде: во-первых, вы, кажется, запускаете несколько запросов, которые зависят друг от друга. Это можно сделать более эффективно. Вы знакомы с SQL Joins ? Во-вторых, разве вы не пропускаете ресурсы JDBC? Похоже, что вы получаете заявление, но не получаете его, чтобы вы могли правильно закрыть его после использования. Пожалуйста, обратитесь к ранее связанному руководству по JDBC для базового объяснения, как правильно работать с кодом JDBC, и этой статье , чтобы найти несколько основных примеров того, как правильно использовать JDBC. В противном случае ваше приложение может рано или поздно аварийно завершить работу, когда в БД закончились ресурсы.

2 голосов
/ 30 марта 2010
while(rs.next()) {
   // iterate
}
...