Исключение ResultSet - перед началом набора результатов - PullRequest
64 голосов
/ 22 января 2010

У меня проблемы с получением данных от ResultSet объекта.Вот мой код:

    String sql = "SELECT type FROM node WHERE nid = ?";
    PreparedStatement prep = conn.prepareStatement(sql);
    int meetNID = Integer.parseInt(node.get(BoutField.field_meet_nid));
    prep.setInt(1, meetNID);

    ResultSet result = prep.executeQuery();
    result.beforeFirst();
    String foundType = result.getString(1);

    if (! foundType.equals("meet")) {
        throw new IllegalArgumentException(String.format("Node %d must be of type 'meet', but was %s", meetNID, foundType));
    }

Трассировка ошибки:

Exception in thread "main" java.sql.SQLException: Before start of result set
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1072)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:986)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:981)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5656)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5576)
    at nth.cumf3.nodeImport.Validator.validate(Validator.java:43)
    at nth.cumf3.nodeImport.Main.main(Main.java:38)

Что я здесь не так делаю?

Ответы [ 6 ]

141 голосов
/ 22 января 2010

В основном вы устанавливаете курсор перед первой строкой, а затем запрашиваете данные. Вам нужно переместить курсор на первый ряд.

 result.next();
 String foundType = result.getString(1);

Обычно это делается в операторе if или цикле.

if(result.next()){
   foundType = result.getString(1);
}
9 голосов
/ 30 ноября 2013

Каждый ответ использует .next () или .beforeFirst (), а затем .next (). Но почему бы не это:

result.first();

Итак, вы просто устанавливаете указатель на первую запись и идете оттуда. Он доступен начиная с java 1.2, и я просто хотел упомянуть это для всех, чей ResultSet существует с одной конкретной записью.

6 голосов
/ 22 января 2010

Вам нужно выполнить result.next (), прежде чем вы сможете получить доступ к результату. Это очень распространенная идиома, чтобы сделать

ResultSet rs = stmt.executeQuery();
while (rs.next())
{
   int foo = rs.getInt(1);
   ...
}
2 голосов
/ 13 сентября 2013

Лучше, если вы создадите класс, который имеет все методы запросов, в том числе, в другом пакете, поэтому вместо ввода всего процесса в каждом классе вы просто вызываете метод из этого класса.

2 голосов
/ 22 января 2010

Вам нужно позвонить next(), прежде чем вы сможете начать чтение значений из первого ряда. beforeFirst ставит курсор перед первой строкой, поэтому нет данных для чтения.

1 голос
/ 22 января 2010

Вам нужно переместить указатель на первую строку, прежде чем запрашивать данные:

result.beforeFirst();
result.next();
String foundType = result.getString(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...