使用递归时重置结果集



我有一个关于Java中的ResultSet对象和递归的问题。

我正在为大学编写一些代码,每当我找到一个子代时,我都会用这个新节点进行递归,但当我退出递归并尝试rs.next()时,指针从指向第1行变回了第0行,当它到达第0行时,rs.next()失败了,它返回了!我知道里面有一件事它还没读呢!是什么导致了这种情况?

我解决这个问题的唯一方法是遍历结果集,获取每个元素并将其添加到数组列表中,然后循环遍历数组列表,对数组中的每个元素进行递归!这肯定是一个更好的解决办法吗?

这是我正在使用的新代码

private Vector<String> getDescendents(String dogname, Vector<String> anc) {
    if (anc == null) anc = new Vector<String>();
    ArrayList<String> tempList = new ArrayList<String>(2);
    try {
        System.out.println("Inside ");
        childStmt.setString(1,dogname);
        childStmt.setString(2,dogname);
        ResultSet rs = childStmt.executeQuery();
        System.out.println("Before while "+rs.getRow());
        while (rs.next()){
            String col1 = rs.getString(1);
            tempList.add(col1);
            anc.add(col1);
        } 
        for (String s:tempList){
            getDescendents(s,anc);
        }
    }
    catch(Exception e) {
        doError(e, "Failed to execute ancestor query in getBreeding");
    }
    return anc;
}

然而,在此之前,我在while循环中有getDescendents调用,因此没有for循环,也没有arraylist,但无论何时它实际递归,当它从递归中返回时,都会失去对结果集的跟踪。

更多详细信息:当我使用调试器时(几乎说gdb那里有太多的C),结果集的ID是相同的,但行指针返回了0,rs.next调用失败了!

再次感谢任何解释!

p.s它以前看起来像

private Vector<String> getDescendents(String dogname, Vector<String> anc) {
    if (anc == null) anc = new Vector<String>();
    ArrayList<String> tempList = new ArrayList<String>(2);
    try {
        System.out.println("Inside ");
        childStmt.setString(1,dogname);
        childStmt.setString(2,dogname);
        ResultSet rs = childStmt.executeQuery();
        System.out.println("Before while "+rs.getRow());
        while (rs.next()){
            String col1 = rs.getString(1);
            anc.add(col1);
            getDescendendts(col1,anc);
        } 
    }
    catch(Exception e) {
        doError(e, "Failed to execute ancestor query in getBreeding");
    }
    return anc;
}

看起来您正在使用childStmt;不要这样做。来自Statement javadoc:

默认情况下,每个Statement对象只能打开一个ResultSet对象同时因此,如果读取一个ResultSet对象与另一个的读取交错,每个都必须生成通过不同的Statement对象。语句中的所有执行方法如果存在一个开放的。

您必须先保存所有行,然后执行递归查询,或者为要获取的每个ResultSet创建一个新的Statement

相关内容

  • 没有找到相关文章

最新更新