数据库中表id是varchar类型,分三级,每级用两位数代替
id     name
01     中国
0101   河南
010101 郑州
  
比如现在想查询表中二级菜单下最小的id值,然后加1,和数据库中比较,有相同值,那么再加1.如果没有相同的值了,那么就得到这个字符串(id),,,public string getid()
{}这个方法怎么写啊??取最小值加一

解决方案 »

  1.   

    首先知道是几位数,然后将值转为int(convert),+1,在转为字符串,然后补0(字符串的PadLeft方法,左补0)
      

  2.   

    sql不会,思路大概是:
    select top 1 id as firstid from table where not exist(select id as secondid from table where secondid = firstid + 1) orderby firstid
    也就是对每条记录查找id+1的记录是否存在,取id+1不存在的记录中id最小的。
      

  3.   

    declare @ParentID nvarchar(100);--上级ID
    declare @linkID nvarchar(100);
    set @ParentID='102'
    set @linkID=@ParentID+'%'
    select right(('0000'+convert(nvarchar(20),convert(bigint,isNull(max(id),@ParentID+'00'))+1)),len(@ParentID)+2)  from Gxh_Area where len(id)=len(@ParentID)+2 and id like @linkID
    如果取最大ID是这样
    但是你的表每级两位显然是不够用的,建议改成3位
      

  4.   


    我的是3位的,所以运行是这样
    max(AreaCode)取最大
    isNull(max(AreaCode),@ParentID+'000')没有情况后面3位是0
    最后强补齐位数,再截取右边6位
      

  5.   


    确实是删除中间的某些,然后想在中间补上。取到最小值加一,如果表里存在,那么在加一。我想在后台写代码,不是sql语句实现。 protected string GetPrivilegeId(string level, string pid)
            {
                string privilegeId = "";
                // 相同父级下,所有的菜单
                IDictionary<string, object> _paraDic = new Dictionary<string, object>();
                _paraDic.Add("@iPrivilegeId", pid);
                _paraDic.Add("@iLevel", level);
                DataTable _dt = SelectPrivilege(_paraDic);
                ArrayList list = new ArrayList();
                if (_dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in _dt.Rows)
                    {
                        list.Add(dr[0].ToString());
                    }
                    //或取最小值
                    int min = int.Parse(list[0].ToString());
                    for (int i = 0; i < list.Count; i++)
                    {
                        int temp = int.Parse(list[i].ToString());
                        if (min > temp)
                        {
                            min = temp;
                        }          
                    }
                    privilegeId = min.ToString();
                }
                return privilegeId;
            }我是这样写的,现在获取到最小值,不知道该怎么写了
      

  6.   


            protected string GetPrivilegeId()
            {
                DataTable dt = new DataTable();//这个是读取数据库当前级别下的所有ID,而且取出来按ID排序
                if (dt.Rows.Count >= 99)//两位最大是99
                    return null;
                for (int i = 1; i < dt.Rows.Count; i++)
                {
                    string min = dt.Rows[i - 1]["id"].ToString();
                    string max = dt.Rows[i]["id"].ToString();
                    if (Convert.ToDouble(min) + 1 != Convert.ToDouble(max))
                    {
                        min = (Convert.ToDouble(min) + 1).ToString().PadLeft(min.Length, '0');
                        return min;
                    }
                }
                return "";
            }
    如果是写到方法就简单了,不过要一次性读取当前节点下的全部数据(不含子节点)
      

  7.   

    linq这么好用的话一都不用
    你为什么要做asp.net呢?
      

  8.   

    protected string GetPrivilegeId(string parentID)
            {
                DataTable dt = new DataTable();//这个是读取数据库当前级别下的所有ID,而且取出来按ID排序 
                if (dt.Rows.Count >= 99)//两位最大是99
                    return null;
                if (dt.Rows.Count == 0)
                    return parentID + "01";
                string max = "";
                for (int i = 1; i < dt.Rows.Count; i++)
                {
                    string min = dt.Rows[i - 1]["id"].ToString();
                    max = dt.Rows[i]["id"].ToString();
                    if (Convert.ToDouble(min) + 1 != Convert.ToDouble(max))
                    {
                        min = (Convert.ToDouble(min) + 1).ToString().PadLeft(min.Length, '0');
                        return min;
                    }
                }
                max = (Convert.ToDouble(max) + 1).ToString().PadLeft(max.Length, '0');
                return max;
            }
      

  9.   

    select id from t
       where id like '0101__' 
       and 
       exists(
       select 1 from t 
       where id=convert
      (varchar(20),min(convert(int,id))+1)   
      )
    以上是查询符合条件的一个id值的sql语句,后面就不需要解释了嘛
      

  10.   

    2.0没有linq
    ……貌似没注意看题 不好意思
    这个跟linq也木啥关系直接弄字符串来搞基本上等于自虐和虐待机器
    直接备份一次数据库 然后给数据库加个数字型排序键值才是正解
    就直接把ID转换被数字再存一份好了