Подтвердить что ты не робот

Исключение ResultSet - до начала набора результатов

У меня возникают проблемы с получением данных из объекта 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)

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

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

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

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

if(result.next()){
   foundType = result.getString(1);
}

Ответ 2

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

ResultSet rs = stmt.executeQuery();
while (rs.next())
{
   int foo = rs.getInt(1);
   ...
}

Ответ 3

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

result.first();

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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