【问题标题】:ResultSet exception - before start of result setResultSet 异常 - 结果集开始之前
【发布时间】:2010-01-22 20:25:46
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在执行简单的 COUNT 查询时使用 result.next() 或 result.first() 是否安全,因为它永远不应该为空,并且只会是 1 个结果。
    • 在这种情况下可能使用result.first()
    • 原来首先返回一个布尔值,而不是我最初认为的第一个结果。似乎我不能像我试图做的那样在 1 行上执行此操作,并且必须使用上述逻辑来执行查询,然后是下一个,然后是 getInt(1)。哦,好吧。
    【解决方案2】:

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

    result.first();
    

    所以您只需将指针设置为第一条记录并从那里开始。它从 java 1.2 开始可用,我只是想为任何 ResultSet 存在一个特定记录的人提一下。

    【讨论】:

    • 使用first() 需要一个可滚动的结果集。如果结果集为TYPE_FORWARD_ONLY,API 要求抛出异常。
    • 只做preparedStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
    【解决方案3】:

    您必须先执行 result.next() 才能访问结果。这是一个很常见的习惯用法

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果您创建一个包含所有查询方法的类会更好,包括在不同的包中,这样您就不必在每个类中键入所有进程,而只需调用该类中的方法。

        【讨论】:

          【解决方案6】:

          在请求数据之前,您需要将指针移动到第一行:

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

          【讨论】:

            猜你喜欢
            • 2011-01-08
            • 1970-01-01
            • 2022-01-18
            • 2011-01-16
            • 1970-01-01
            • 2011-04-12
            • 2018-06-23
            • 2012-02-08
            相关资源
            最近更新 更多