数据库表字段.
ID         
V_PARENTID 上一级的ID
V_LEVEL    等级
我现在要做的是.更新一条记录时.该项的V_LEVEL已经更新.我要让该项的子项和子项的子项..等..的V_LEVEL都按相应的等级走..
但是我这个代码不知道哪里写错了. ..求助..///// <summary>
        ///// 更新一条数据
        ///// </summary>
        //public void Update(Maticsoft.Model.Entity_T_MENUBASE model)
        //{
        //    SqlConnection sqlcon = Osqlcontrol.CreateSqlConnection();
        //    sqlcon.Open();
        //    SqlTransaction st = sqlcon.BeginTransaction();           
        //    string sqlstr = "update T_MENUBASE set v_parentid=@v_parentid,v_level=@v_level,v_title=@v_title,v_description=@v_description,v_url=@v_url,v_state=@v_state,v_nodepic=@v_nodepic where ID=@ID";        //    SqlCommand sc = new SqlCommand(sqlstr,sqlcon,st);
        //    sc.Parameters.Add("@ID", SqlDbType.VarChar, 50);
        //    sc.Parameters.Add("@v_parentid", SqlDbType.VarChar, 50);
        //    sc.Parameters.Add("@v_level", SqlDbType.VarChar, 50);
        //    sc.Parameters.Add("@v_title", SqlDbType.VarChar, 50);
        //    sc.Parameters.Add("@v_description", SqlDbType.VarChar, 50);
        //    sc.Parameters.Add("@v_url", SqlDbType.VarChar, 100);
        //    sc.Parameters.Add("@v_state", SqlDbType.VarChar, 50);
        //    sc.Parameters.Add("@v_nodepic", SqlDbType.VarChar, 200);
        //    sc.Parameters["@ID"].Value = model.ID;
        //    sc.Parameters["@v_parentid"].Value = model.v_parentid;
        //    sc.Parameters["@v_level"].Value = model.v_level;
        //    sc.Parameters["@v_title"].Value = model.v_title;
        //    sc.Parameters["@v_description"].Value = model.v_description;
        //    sc.Parameters["@v_url"].Value = model.v_url;
        //    sc.Parameters["@v_state"].Value = model.v_state;
        //    sc.Parameters["@v_nodepic"].Value = model.v_nodepic;
        //    if (sc.ExecuteNonQuery() <= 0)
        //    {
        //        st.Rollback();
        //    }
        //    else
        //    {
        //        //
        //        if (UpdateLevel(model.ID, Convert.ToInt32(model.v_level), sqlcon, st))
        //        {
        //            st.Commit();
        //            JScript.Alert("ok");
        //        }
        //        else
        //        {
        //            st.Rollback();
        //            JScript.Alert("更新失败");
        //        }
        //    }
        //    sqlcon.Close();
        //}        ///// <summary>
        ///// 用递归进行更新下级别所有等级
        ///// </summary>
        ///// <param name="id"></param>
        ///// <param name="level"></param>
        ///// <returns></returns>
        //public bool UpdateLevel(string id,int level,SqlConnection sqlcon, SqlTransaction st)
        //{
        //    try
        //    {
        //        //连接是否打开.如果没有则打开
        //        if (sqlcon.State != ConnectionState.Open)
        //        {
        //            sqlcon.Open();
        //        }        //        //查询该项直接子项有多少个
        //        string sqlstr1 = "select * from t_menubase where v_parentid='"+id+"'";
        //        SqlCommand scc=new SqlCommand(sqlstr1,sqlcon,st);
        //        SqlDataAdapter sda=new SqlDataAdapter(scc);
        //        DataSet dss=new DataSet();                
        //        sda.Fill(dss);
        //        DataTable dt = dss.Tables[0];
        //        int Counts = dt.Rows.Count;        //        //将等级加一.子项的LEVEL比上一级大1
        //        int newlevel = level + 1;        //        //循环更新每一项的子项
        //        for (int i = 0; i < dt.Rows.Count; i++)
        //        {
        //            string newId = dt.Rows[i]["Id"].ToString();
        //            string sqlstr = "update t_menubase set v_level="+newlevel+" where v_parentid='"+newId+"'";
        //            SqlCommand sc = new SqlCommand(sqlstr, sqlcon, st);
        //            int num=sc.ExecuteNonQuery();
                    
        //            //调用自己将子项的项的等级也更新
        //            if (UpdateLevel(newId, newlevel, sqlcon, st) != true)
        //            {
        //                return false;
        //            }
        //        }
        //        return true;
        //    }
        //    catch (Exception ex)
        //    {
        //        return false;
        //    }
        //}

解决方案 »

  1.   

      //调用自己将子项的项的等级也更新
            //            if (UpdateLevel(newId, newlevel, sqlcon, st) != true)
            //            {
            //                return false;
            //            }
    用newlevel 更新 ,肯定找不到原来的子项了。
      

  2.   

    而且有一个分支被遍历后,就会返回false ,其余同层节点将不会被访问。
      

  3.   

    哦  异常才会返回false  可以遍历 
      

  4.   


    if (sc.ExecuteNonQuery() <= 0)
         {
            st.Rollback();
         }
        else
        {
            //这里是不是应该commit一下,不然更新子集是能否检测到更新的数据????
            if (UpdateLevel(model.ID, Convert.ToInt32(model.v_level), sqlcon, st))
           {
                st.Commit();
                JScript.Alert("ok");
            }
            else
             {
                st.Rollback();
                JScript.Alert("更新失败");
            }
            //    }int newlevel = level + 1;//加断点检查newlevel的值        //循环更新每一项的子项
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                string newId = dt.Rows[i]["Id"].ToString();//加断点检查newID的值
                string sqlstr = "update t_menubase set v_level="+newlevel+" where v_parentid='"+newId+"'";
               SqlCommand sc = new SqlCommand(sqlstr, sqlcon, st);
               int num=sc.ExecuteNonQuery();
                        
                //调用自己将子项的项的等级也更新
               if (UpdateLevel(newId, newlevel, sqlcon, st) != true)
               {
               return false;
              }
     }楼主先检查一下吧,一般都应该是逻辑错误
      

  5.   

    for (int i = 0; i < dt.Rows.Count; i++)
    注意这个for控制的循环,进入循环的时候i=0,当i=0这个分支运行到最末端的时候,
    if (UpdateLevel(newId, newlevel, sqlcon, st) != true)
    {
         return false;
    }
    从这里返回。所以其他分之无法更新。
      

  6.   

    返回后Update方法判断是否提交..
      

  7.   

    从事务上来讲,不应该一个UpdateLevel就Commit一下,这样数据可能会不一致.
    估计是在
    catch(Exception ex)
    {
       return false;
    }
    有问题,中途return false了,考虑把return false 改为throw ex; 看看,什么地方异常了吧,
    并且
    try
    {
       UpdateLevel();
       Commit;
    }
    catch(Exception ex)
    {
       Rollback;//比较好,
    }
    个人观点.另外BOM结构是不是有问题?