我新闻类别用的是无限极分类的那种,我现在想调新闻中属于某一个大类的新闻,我用的sql 是 in (.....),现在我就是想写一个递归方法,输入一个新闻大类的id,返回这个新闻大类下的所有小类的id ,因为新闻的分类是无限极,所以得用递归,我自己写了个方法,可不知道哪有问题
代码:
 public static string ReturnString_Byd(string  id)
    {
        dbmethod mh = new dbmethod();
        StringBuilder sb = new StringBuilder();
        SqlDataReader dr = mh.getsqldatareaderbysql("select n_Id from TB_NewsType where n_Nid="+id );
        while (dr.Read())
        {
            sb.Append(dr ["n_Id"]);
            sb.Append(",");
        }
        dr.Close();
        dr.Dispose();
       sb .Append ( ReturnString_Byd2(sb.ToString().Substring(0, sb.Length - 1)));
        return sb.ToString().Substring (0,sb .Length -1);
       
    }
    public static string ReturnString_Byd2(string str)
    {
        StringBuilder sb2 = new StringBuilder();
        string[] aa = str.Split(',');
        foreach (string a in aa)
        {
           sb2 .Append ( ReturnString_Byd3(a));
        }
        return sb2.ToString();
    }
    public static string ReturnString_Byd3(string id)
    {
        dbmethod mh = new dbmethod();
        StringBuilder sb3 = new StringBuilder();
        SqlDataReader dr = mh.getsqldatareaderbysql("select n_Id from TB_NewsType where n_Nid=" + id);
        while (dr.Read())
        {
            sb3.Append(dr["n_Id"]);
            sb3.Append(",");
        }
        dr.Close();
        dr.Dispose();
        if (sb3.Length == 0)
        {        }
        else
        {
            sb3.Append(ReturnString_Byd2(sb3.ToString().Substring(0, sb3.Length - 1)));
            
        }
        return sb3.ToString().Substring(0, sb3.Length - 1);
    }

解决方案 »

  1.   

    递归查询你不觉得很不好吗? 如果你想递归就用存储过程如果栏目表较少,就把搜有的栏目取出来放在缓存里,递归查缓存的DataTable
      

  2.   

    能在SQL里实现的东西最好还是用SQLpublic static DataTable GetLower(string parentid )
            {
                string sSql = "with Res(nodeid, parentid, nodename,Lev) as "
                    + "(select parentid,nodeid,nodename,0 as lev from tb where Manager_id='"+parentid +"'"
                    + " union all "
                    + " select e.parentid,e.nodeid,e.nodename,lev+1 from tb e,Res r where e.parentid=r.nodeid "
                    + ")"
                    + " select nodeid, parentid, nodename,Lev from Res";
                ///执行SQL的语句返回datatable。
            }
      

  3.   


    public static DataTable GetLower(string parentid )
            {
                string sSql = "with Res(nodeid, parentid, nodename,Lev) as "
                    + "(select parentid,nodeid,nodename,0 as lev from tb where parentid='"+parentid +"'"
                    + " union all "
                    + " select e.parentid,e.nodeid,e.nodename,lev+1 from tb e,Res r where e.parentid=r.nodeid "
                    + ")"
                    + " select nodeid, parentid, nodename,Lev from Res";
                ///执行SQL的语句返回datatable。
            }
    打错一个  你把parentid,nodeid 换成你自己的字段名字 再把表名tb换成你的表就能用了
      

  4.   

    public static string ReturnString_Byd(string  id) 
        { 
      StringBuilder sb = new StringBuilder(); 
            dbmethod mh = new dbmethod(); 
            SqlDataReader dr = mh.getsqldatareaderbysql("select n_Id from TB_NewsType where n_Nid="+id ); 
            while (dr.Read()) 
            {
              if(Chind(dr["n_Id"].ToString())
               sb.Append(dr["n_Id"].ToString+",");
              esle
                sb.Append(string ReturnString_Byd(dr["n_Id"].ToString()) );
            }
     return sb.ToString();
     }
    public bool 
    Chind(string  id) //判断是否有子项
        { 
    bool Flag=false;
      StringBuilder sb = new StringBuilder(); 
            dbmethod mh = new dbmethod(); 
            SqlDataReader dr = mh.getsqldatareaderbysql("select n_Id from TB_NewsType where n_Nid="+id );
            if(dr.Getscheme().Table[0].Rows.Count>0)
              Flag=true;
             else
             Flag=false;
    dr.Close();
    return Flag;

           }