在while内部调用方法时用尽的Resultset(rset.next)

时间:2014-04-15 22:12:16

标签: java sql jdbc

我从下面的代码中获得了一个Exhausted结果集。

我现在尝试了一些不同的东西,但却无法找到解决方案 如果我不打电话给歌曲方法它可以工作,但是歌曲方法在它被调用时起作用,无法理解它,希望我能错过一些简单的东西。

public void refreshList() {

    rset = po.getProduct();

    if (plist.size() > 0) {
        for (int i = plist.size() - 1; i >= 0; i--) {
            plist.remove(i);
        }
    }
    try {
        while (rset.next()) {

            songs(rset.getString(1));
            CD c = new CD(alist);

            Product p = new Product(rset.getString(1), 
                    rset.getString(2),
                    rset.getString(3), 
                    rset.getDouble(4), 
                    rset.getDouble(5), 
                    rset.getInt(6),
                    rset.getString(7),
                    rset.getString(8),
                    rset.getString(9), 
                    rset.getDouble(10), c);
            plist.add(p);

        }
    } catch (Exception ex) {
        System.out.println(ex);
    }
}


  public void songs(String ID)
{
    rset = po.getSongs();
    alist = new ArrayList<Song>();
    try {
        while (rset.next()){
            Song s = new Song(rset.getString(1),
                    rset.getString(2), 
                    rset.getString(3));
            slist.add(s);
        }   
    } 
    catch (Exception ea) {
        System.out.println(ea);
    }

    for(int i = 0; i < slist.size(); i++)
    {
        if(slist.get(i).getSong_id().equals(ID))
        {
            alist.add(slist.get(i));
        }
    }
}

1 个答案:

答案 0 :(得分:1)

refreshListwhile (rset.next())循环,在每次迭代时,您都有songs(rset.getString(1));,其本身有while(rset.next()。这导致结果集耗尽,因为当您从songs()返回时,您尝试从结果集的当前position中获取更多数据,而在songs()中您从while (rset.next())中获取循环,即检索其所有行。考虑重构代码以避免基于结果集的嵌套循环。