天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧软件 >> 正文

SQL Server 2005新特性之使用with关键字解决递归父子关系

2008-12-23不详佚名

在该方法按照以下步骤执行:

1. 使用命令对象对象执行 pr_GetLocations 存储过程返回结果集  

2. 如果数据阅读器读取了数据( reader.Read 方法返回 true )执行:  

       2.1. 从数据阅读器当前记录中读取 Location 对象,并返回层数信息( out level  

       2.2. 如果是第一层( level 等于 0 )填充 locs 集合,并加入到 container 对象  

       2.3. 如果不是第一层根据层标志( oldlevel )判断当前层是否是新的一层  

2.4 如果当前层是新的一层清空 container 集合并将 current 集合中实体复制到 container 集合中,清空 current 集合并置层标志( oldlevel  

2.5 将当前对象添加到 current 集合中  

2.6 调用 CreateLocation 方法从 container 上层集合中匹配当前实体父级对象并加入父对象的子集合中  

3. 重复第 2 步直到读取完全部数据  

可以看到 container 集合始终保存了当前层的上层所有的实体对象,并且为了在更换层数后能够正确的更新 container 集合,使用 current 集合保存当前层的实体对象。

3.8 编写 GetLocationFromReader 方法,用于从数据阅读器中返回 Location 实体对象,并将层数信息使用 out 参数返回:

private Location GetLocationFromReader(SqlDataReader reader, out int level)  

{  

    Location loc = new Location();  

    loc.Id = Convert.ToInt32(reader["id"]);  

    loc.Name = Convert.ToString(reader["name"]);  

 

    object o = reader["parent"];  

    if (o != DBNull.Value)  

        loc.ParentId = Convert.ToInt32(o);  

 

    level = Convert.ToInt32(reader["loclevel"]);  

 

    return loc;  

}  

3.9 编写 CreateLocation 方法,该方法遍历实体集合找到与当前实体对象的父级编号匹配的实体,并将当前实体加入到父级实体的子集合中:

private void CreateLocation(LocationCollection container, Location loc)  

{  

    foreach (Location location in container)  

    {  

        if (location.Id == loc.ParentId)  

        {  

            location.SubLocations.Add(loc);  

            break;  

        }  

    }  

}  

9 7 3 1 2 3 4 5 6 7 4 8 :

本文来源:不详 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。文章是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 Email:support@txwb.com,系统开号,技术支持,服务联系微信:_WX_1_本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行