你这个递归没有返回条件的,
会不会是调用的RMenu太多导致新建太多的ResultSet 实例造成这样啊?

解决方案 »

  1.   

    有这个可能。当ConnectDB.SetQuery("select * from tblMenu where ParentNo = " + iParentNo);执行后,就把本次查询结果给了ResultSet rs=ConnectDB.ResultSet。递归进入下一个,ResultSet rs 的指钟又指向下一个查询结果,上次的就无用了。
    也就关闭了。不知道这样分析的对不对.
      

  2.   

    在进行数据库查询的时候不建议使用递归这种方式。
    具体的原因你可以跟踪调试一下。
    再就是你的程序里ResultSet没有close。
     try
       ResultSet rs = null;
       {
           rs = ConnectDB.GetResultSet();
           while(rs.next())
           {
                System.out.println(rs.getString("MenuName"));
                int sn = rs.getInt("SerialNo");
                RMenu(sn);
           }
        }
        catch(SQLException sqle)
        {
                System.err.println(sqle.toString());
        }finally{
            try{
               if(rs != null)
                   rs.close();
            }catch(Exception e){}
        }
      

  3.   

    你是想达到取菜单设置的目的吧。
    递归程序写的没问题,
    但对数据库资源的申请与管理上肯定有问题。
    比较好的办法是,你把这些信息一次性全读到一个数组内。然后用你的递归程序遍历数组。这样概念清晰。不会涉及到递归过程内对数据库资源的管理。
    如:你定义数组:MenuRecord[] a = new MenuRecord[100];
    这样可以容纳100个对象。如果你不知道具体个数,可以用ArrayList来保存。
    之后,用你的程序访问数组a,就会非常的方便了。
      

  4.   

    完整示范代码:
    import com.sun.j2ee.blueprints.util.tracer.Debug;
    public class TestRec
    {
        static java.util.ArrayList menuList = new java.util.ArrayList();
        class MenuRec
        {
            String parentNO,sn,menuName;
            MenuRec(String p,String s,String m)
            {
                parentNO = p;
                sn =s;
                menuName = m;
            }
            public String toString()
            {
                return parentNO+" "+sn+" "+menuName;
            }
        }    public void go()
        {
            try
            {
                java.sql.Connection conn = Debug.ConnectionPool.getConnection();            getAllMenu(conn);            conn.close();
            }catch(Exception ex)
            {
                ex.printStackTrace();
            }
            RMenu(0);
        }
        void getAllMenu(java.sql.Connection conn)
        {
            try
            {
                java.sql.PreparedStatement ps = conn.prepareStatement(
                    "select parent_no,sn,menu_name from TEST_REC");
                java.sql.ResultSet rs = ps.executeQuery();
                while (rs.next())
                {
                    menuList.add(new MenuRec(rs.getString(1), rs.getString(2),
                                       rs.getString(3)));
                }
                rs.close();
                ps.close();
            }catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
        public static java.util.ArrayList getRecordList(int iParentNO)
        {
            java.util.ArrayList a= new java.util.ArrayList();
            for(int i=0;i<menuList.size();i++)
            {
                MenuRec r = (MenuRec) menuList.get(i);
                if (r.parentNO.equals(""+iParentNO))
                {
                    a.add(r);
                }
            }
            return a;
        }
        public static void RMenu(int iParentNo)
        {
               java.util.ArrayList a = getRecordList(iParentNo);
               for(int i=0;i<a.size();i++)
               {
                   MenuRec r = (MenuRec) a.get(i);
                    System.out.println( r.menuName );
                    int sn = Integer.parseInt( r.sn );
                    RMenu(sn);
               }
        }
        public static void main(String[] args)
        {
            Debug.ConnectionPool.setUrl("jdbc:oracle:thin:@bigang:1521:orcl");
            Debug.ConnectionPool.setUserPassword("helios_ndc","helios");        TestRec t = new TestRec();
            t.go();
        }}
      

  5.   

    数据库脚本:
    drop table TEST_REC cascade constraints
    /create table TEST_REC  (
       ID number(2),
       PARENT_NO NUMBER(2),
       MENU_NAME varchar2(100),
       SN NUMBER(2)
    )
    /
      

  6.   

    初始化数据脚本:
    truncate table test_rec;
    /
    insert into test_rec(id,parent_no,menu_name,sn) values(0,0,'M0',1);
    insert into test_rec(id,parent_no,menu_name,sn) values(1,0,'M1',2);
    insert into test_rec(id,parent_no,menu_name,sn) values(2,0,'M2',3);
    insert into test_rec(id,parent_no,menu_name,sn) values(3,2,'SM0_1',4);
    insert into test_rec(id,parent_no,menu_name,sn) values(4,2,'SM0_2',5);
    insert into test_rec(id,parent_no,menu_name,sn) values(5,3,'SM1_1',6);
    insert into test_rec(id,parent_no,menu_name,sn) values(5,3,'SM1_2',7);
    /
      

  7.   

    说明:以上在Jbuilder9+win2k+Oracle8i下测试通过。
    因为数据库很简单,是都是sql92标准,因此在其他库下应该也没问题。
    另外,在我给出的代码中,有Debug.class类,那个是用来辅助连接数据库的,
    你自己根据需要换成你的数据库连接就可以了。
      

  8.   

    确实可行!
    feiyuegaoshan(飞跃) ,真是高手!能不能留个E-mail,以后多多交流一下?