一张表如下(表中关联,以各自的ID来取关联值):
 
         1 0        生活用品
2 1 茶杯
3 0 体育用品
4 3 足球
5 1 牙膏
6 1 牙刷
7 2 铁杯我想它在DropDownList的下拉菜单中显示出来的条目是:
生活用品/茶杯/铁杯
生活用品/牙膏
生活用品/牙刷我的代码如下:
DSN=ConfigurationSettings.AppSettings["dsn"];
conn=new SqlConnection(DSN);
conn.Open();
//ArrayList ProductLitId=new ArrayList();//取得小类的id值
ArrayList ProductSmall=new ArrayList();
string ProductList="";
string ProductSmallRead="";
//ArrayList al=new ArrayList();
if(!IsPostBack)
{   

//--------------------取大类id对应的类别名称---------------------- string ProductBigRead="select * from ccfl where id='"+Request.QueryString["id"]+"'";
SqlCommand comm=new SqlCommand(ProductBigRead,conn);
SqlDataReader dr=comm.ExecuteReader();
if(dr.Read())
{
string ProductBigList=dr["lbmc"].ToString();
Session["lbmc"]=ProductBigList;

}
dr.Close(); //--------------------取大类对应的id的小类类别名称------------- string ProductLitRead="select * from ccfl where lb_id='"+Request.QueryString["id"]+"'";
SqlCommand com=new SqlCommand(ProductLitRead,conn);
SqlDataReader sdr=com.ExecuteReader();
while(sdr.Read())
{
string ProductLitList=sdr["lbmc"].ToString();
ProductList=Session["lbmc"]+"/"+ProductLitList;

ProductSmallRead="select * from ccfl where lb_id='"+sdr["id"]+"'";
SqlCommand co=new SqlCommand(ProductSmallRead,conn);
SqlDataReader sdrr=co.ExecuteReader();
ProductSmall.Add(ProductList);
while(sdrr.Read())
{
ProductList+="/"+sdrr["lbmc"].ToString();
ProductSmall.Add(ProductList);
}
sdrr.Close();
//ProductLitId.Add(sdr["id"].ToString());
                ProductSmall.Add(ProductList);
}出现的错误,本人知道哪里错,就是不知道如何去解决,第一个DataReader不能关闭:
已有打开的与此连接相关联的 DataReader,必须首先将它关闭。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: 已有打开的与此连接相关联的 DataReader,必须首先将它关闭。源错误: 
行 71:  ProductSmallRead="select * from ccfl where lb_id='"+sdr["id"]+"'";
行 72:  SqlCommand co=new SqlCommand(ProductSmallRead,conn);
行 73:  SqlDataReader sdrr=co.ExecuteReader();
行 74:  ProductSmall.Add(ProductList);
行 75:  while(sdrr.Read())
  sdr.Close(); //--------------------取得小类对应的id的子类类别名称----------------- }


}
//-------------------------绑定DropDownList的值---------------------
Dp_spfl.DataSource=ProductSmall;
Dp_spfl.DataBind();
}

解决方案 »

  1.   

    SqlDataReader sdrr=co.ExecuteReader();
    前加入sdr.Close();
      

  2.   

    select id,t1.name+t2.name+t3.name+...  as longname from table1 t1 
    left join (select * from table1 ) t2 on t2.id=t1.parentid
    left join (select * from table1 ) t3 on t3.id=t2.parentid
    .....
      

  3.   

    如果有最大层次的限制,用上面的SQL语句一次搞定;
    如果层次无限大,则可以写一个存储过程
      

  4.   

    看看这个代码:
    <%@ page language="vb"%>
    <%@ register tagprefix="romantic" namespace="fw" assembly="admin_net"%>
    <html>
    <head>
    <style>
    body{font-size:9pt;margin-top=3px;margin-left:2px;margin-right:2px;margin-bottom:3px}
    table{font-size:9pt}
    a:link{text-decoration:none;color:#000000}
    a:hover{text-decoration:underline;color:red}
    a:active{text-decoration:underline;color:red}
    a:visited{text-decoration:none}
    body{scrollbar-face-color:#99EFCF;scrollbar-track-color:#D5FDEE;scrollbar-arrow-color:red;scrollbar-shadow-color:#FFFBE1}
    </style>
    <script language="vb" runat="server">
    sub page_load(sender as object, e as eventargs)
    if not ispostback then
    bind(0)
    end if
    end sub
    sub bind(byval parentid as integer)
    dim fw as new admin_net
    dim i as integer
    dim dv as new dataview
    dv=fw.bind
    dv.rowfilter="parentid = " + parentid.tostring
    Dim Row As DataRowView
    For Each Row In dv
    dim j as integer
    dim stemp as string=""
    for j=1 to cint(row("layer"))
    stemp=stemp & "&nbsp;&nbsp;&nbsp;&nbsp;"
    next 
    dim theimage as string
    if cint(row("child"))=0 then
    theimage="<img src=new/minus.gif>"
    else
    theimage="<img src=new/plus.gif>"
    end if
    label1.text=label1.text & "<tr bgcolor=#ffffff><td>" & stemp & theimage & "<b>" & row("boardname") & "&nbsp;(" & row("child") & ")</b>" & "&nbsp;&nbsp;&nbsp;&nbsp;<b>[ </b><font color=red>版面</font>:<a href=net_updateboard.aspx?boardid=" & row("boardid") & "&parentstr=" & row("parentstr") & "&child=" & row("child") & ">修改</a> | <a href=net_deleteboard.aspx?boardid=" & row("boardid") & "&parentstr=" & row("parentstr") & "&child=" & row("child") & ">删除</a> | <a href=net_addboard.aspx?boardid=" & row("boardid") & "&parentstr=" & row("parentstr") & "&child=" & row("child") &  ">添加</a> | <a href=net_advance.aspx?boardid=" & row("boardid") & "&parentstr=" & row("parentstr") & "&child=" & row("child") &  ">高级</a> <b> ]</b> &nbsp;&nbsp; <b>[ </b><font color=red>数据</font>:<a href=net_add.aspx?boardid=" & row("boardid") & ">添加</a> | <a href=tec_admin.aspx?boardid=" & row("boardid") & ">管理</a> | <a href=tec_delete.aspx?boardid=" & row("boardid") & ">删除</a> | <a href=tec_clear.aspx?boardid=" & row("boardid") & ">清空</a><b> ]</b></td>"  
    bind(Int32.Parse(Row("boardid").ToString()))
    Next
    dv=nothing
    end sub
    </script>
    </head>
    <body>
    <form runat="server"><table width=100% cellpadding=4 cellspacing=1 bgcolor=#aab7b7>
    <tr><th background="new/tiao1.jpg" height=27>版面管理</th><asp:label id=label1 runat="server"/></table>
    <br></form>
    </body>
    </html>
    ---------------------------------------------------------------option explicit
    option strict
    imports system
    imports system.web
    imports system.data
    imports system.data.oledb
    imports system.xml
    imports Microsoft.visualbasic
    Imports System.Web.UI
    Imports System.Web.UI.webcontrols
    namespace fw
    public class admin_net
    inherits page
    public function bind as dataview
    on error goto err11
    dim strcnn as string=system.configuration.configurationsettings.appsettings("strcnn")
    dim cnn as oledbconnection
    dim cmd as oledbdataadapter
    dim ds as new dataset
    cnn=new oledbconnection(strcnn)
    cnn.open()
    dim strsql as string="select boardname,boardid,parentid,layer,child,parentstr from net"
    cmd=new oledbdataadapter(strsql,cnn)
    cmd.fill(ds,"tables1")
    bind=ds.tables("tables1").defaultview
    cnn.close()
    cnn=nothing
    exit function
    err11:
    end function
    end class
    end namespace