Исключение 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)
Что я здесь делаю неправильно?
Ответы
Ответ 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);