ResultSet异常-结果集开始之前


76

我无法从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)

我在这里做错了什么?

Answers:


164

基本上,您将光标放在第一行之前,然后请求数据。您需要将光标移动到第一行。

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

通常在if语句或循环中执行此操作。

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

执行简单的COUNT查询时,使用result.next()或result.first()是安全的,因为它永远不会为null,并且永远只有1个结果。
jDub9

2
也许result.first()用于这种情况。
文森特·拉姆丹妮

原来首先返回一个布尔值,而不是我最初认为的第一个结果。似乎我无法像尝试那样在一行上执行此操作,不得不使用上述逻辑来执行查询,然后是下一个,然后是getInt(1)。那好吧。
jDub9

11

每个答案都使用.next()或使用.beforeFirst()然后.next()。但是为什么不这样:

result.first();

因此,您只需将指针设置为第一条记录,然后从那里开始。它从Java 1.2开始可用,我只想为ResultSet存在一个特定记录的任何人提到这一点。


使用first()需要滚动结果集。如果结果集为,则API要求引发异常TYPE_FORWARD_ONLY
Mark Rotteveel

6

您必须先执行result.next()才能访问结果。这是很常见的成语

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

3

您必须先调用next()才能开始从第一行读取值。beforeFirst将光标放在第一行之前,因此没有要读取的数据。


2

最好创建一个包含所有查询方法的类,包括一个包中的所有查询方法,因此最好不要从每个类中键入所有过程,而只是从该类中调用该方法。


1

您需要先将指针移到第一行,然后再请求数据:

result.beforeFirst();
result.next();
String foundType = result.getString(1);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.