使用递归时ResultSet重置

时间:2012-03-02 19:35:56

标签: java sql recursion resultset

我对Java和递归中的ResultSet对象有疑问。

我正在研究大学的一些代码,每当我找到一个后代时,我都会使用这个新节点,但当我从递归中走出来并尝试rs.next()时,指针已从指向第1行返回到第0行,当它到达第0行时,rs.next()失败并返回!我知道那里有一件事还没有读过!是什么导致了这个?

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

这是我正在使用的新代码

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;
}

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

进一步详情: 当我使用调试器(几乎说gdb那里lol太多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;
}

1 个答案:

答案 0 :(得分:12)

看起来你正在重复使用childStmt;不要这样做。来自Statement javadoc

  

默认情况下,每个Statement对象只能打开一个ResultSet对象   同时。因此,如果读取一个ResultSet对象是   与另一个的读取交错,每个必须已经生成   通过不同的Statement对象。 Statement中的所有执行方法   如果是,接口隐式关闭一个statment的当前ResultSet对象   打开一个。

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