Я испытываю затруднения при получении данных из a 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)
Что я делаю неправильно здесь?
В основном, вы устанавливаете курсор перед первой строкой и затем запрашиваете данные. Нужно подвести курсор к первой строке.
result.next();
String foundType = result.getString(1);
Обычно это делается в операторе if или в цикле.
if(result.next()){
foundType = result.getString(1);
}
Вы должны позвонить Далее ()
, прежде чем вы сможете начать чтение значений из первой строки. Forefirst
ставит курсор до первого ряда, поэтому нет данных для чтения.
Вам нужно переместить указатель на первый ряд, прежде чем спрашивать данные:
result.beforeFirst();
result.next();
String foundType = result.getString(1);
Вы должны сделать result.next(), прежде чем вы сможете получить доступ к результату. Это очень распространенная идиома - делать
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
int foo = rs.getInt(1);
...
}