你是想达到取菜单设置的目的吧。 递归程序写的没问题, 但对数据库资源的申请与管理上肯定有问题。 比较好的办法是,你把这些信息一次性全读到一个数组内。然后用你的递归程序遍历数组。这样概念清晰。不会涉及到递归过程内对数据库资源的管理。 如:你定义数组:MenuRecord[] a = new MenuRecord[100]; 这样可以容纳100个对象。如果你不知道具体个数,可以用ArrayList来保存。 之后,用你的程序访问数组a,就会非常的方便了。
完整示范代码: 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(); }}
数据库脚本: drop table TEST_REC cascade constraints /create table TEST_REC ( ID number(2), PARENT_NO NUMBER(2), MENU_NAME varchar2(100), SN NUMBER(2) ) /
初始化数据脚本: 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); /
也就关闭了。不知道这样分析的对不对.
具体的原因你可以跟踪调试一下。
再就是你的程序里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){}
}
递归程序写的没问题,
但对数据库资源的申请与管理上肯定有问题。
比较好的办法是,你把这些信息一次性全读到一个数组内。然后用你的递归程序遍历数组。这样概念清晰。不会涉及到递归过程内对数据库资源的管理。
如:你定义数组:MenuRecord[] a = new MenuRecord[100];
这样可以容纳100个对象。如果你不知道具体个数,可以用ArrayList来保存。
之后,用你的程序访问数组a,就会非常的方便了。
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();
}}
drop table TEST_REC cascade constraints
/create table TEST_REC (
ID number(2),
PARENT_NO NUMBER(2),
MENU_NAME varchar2(100),
SN NUMBER(2)
)
/
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);
/
因为数据库很简单,是都是sql92标准,因此在其他库下应该也没问题。
另外,在我给出的代码中,有Debug.class类,那个是用来辅助连接数据库的,
你自己根据需要换成你的数据库连接就可以了。
feiyuegaoshan(飞跃) ,真是高手!能不能留个E-mail,以后多多交流一下?