Вопрос-ответ

ResultSet exception - before start of result set

Исключение результирующего набора - перед запуском результирующего набора

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

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

result.first();

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

Ответ 3

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

ResultSet rs = stmt.executeQuery();
while (rs.next())
{
int foo = rs.getInt(1);
...
}
Ответ 4

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

java jdbc