当前位置: 首页 > news >正文

网站开发设计报告怎么做网站赚

网站开发设计报告,怎么做网站赚,网站租用价格,做网站营销1. 引言 现实项目中经常遇到需要处理递归父子关系的问题#xff0c;如果把层次关系分开#xff0c;放在多个表里通过主外键关系联接#xff0c;最明显的问题就是扩展起来不方便#xff0c;对于这种情况#xff0c;一般我们会创建一个使用自连接的表来存放数据。例如存放会… 1. 引言 现实项目中经常遇到需要处理递归父子关系的问题如果把层次关系分开放在多个表里通过主外键关系联接最明显的问题就是扩展起来不方便对于这种情况一般我们会创建一个使用自连接的表来存放数据。例如存放会员地区数据表结构可能是这样 列名描述location_id地区编号location_name地区名称parentlocation_id上级地区编号或者某个部分的职员表结构可能如下所示 列名描述employee_id职员编号employee_name职员名称manager_id职员的直接上级管理者,和employee_id进行自联接通过类似表结构我们就可以通过一个表理论上管理无限级数的父/子关系但是当我们需要将这些数据读取出来不论是填充到一个树中或是使用级联显示出来需要花费一定的精力。传统的做法是做一个递归调用首先连接数据库将顶层数据也就是parent_xxx为null的记录读取出来再对每一条数据进行递归访问填充集合这种做法需要连接数据库多次显然不是较好的解决方法那么我们能不能通过一次数据库访问将数据全部读取出来并且为了按照父子关系形成集合使返回的数据满足某种格式。 2. 分析 理想情况下如果父/子关系数据时严格按照关系结构添加到数据库中亦即首先添加某条父记录接着添加该父记录的子记录如果子记录还包含子记录的话继续添加最终数据表中父/子关系按规则排列数据我们就可以使用某种算法填充集合但是正如我们所说这是理想情况实际情况下数据经常会发生改变导致数据没有规律可言如下图所示这样的话读取数据填充集合就不太容易的。 所以我们要做的就是通过查询使数据库返回的数据满足这种格式那么我们的思路是首先查找顶层0层记录再查询第1层记录接下来是第2层、第3层直到第n层。因为层数是不确定的所以仍然需要使用递归访问。 SQL Server 2005中提供了新的with关键字用于指定临时命名的结果集这些结果集称为公用表表达式CTE。该表达式源自简单查询并且在SELECT、INSERT、UPDATE或DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中作为该语句的 SELECT 定义语句的一部分。公用表表达式可以包括对自身的引用。这种表达式称为递归公用表表达式。 其语法为 [ WITH common_table_expression [ ,...n ] ] common_table_expression:: expression_name[ ( column_name [ ,...n ] ) ] AS ( CTE_query_definition ) 使用with关键子的一个简单示例以下代码将tb_loc表中数据源样输出 WITH locs(id,name,parent) AS (SELECT * FROM tb_loc ) SELECT * FROM locs 为了创建良好层次记录结构集使用with关键字首先读取顶层记录并且针对每一条顶层记录读取其子记录直到读取到最底层级记录最后将所有的记录组合起来这里用到了UNION ALL关键字用于将多个查询结果组合到一个结果集中。 接下来就可以使用该关键字创建存储过程返回结果集并附加每条记录所位于的“层”数如下图所示 最后需要在前台界面将其显示出来由于记录已经按层次返回需要做的就是按层次首其输出首先将第0层数据输出接下来将遍历第0层数据将第一层数据添加到合适的父对象中重复此过程直到填充结果。那么这里的难题就在于如何查找父对象我们当然可以遍历集合但是这么做的话如果数据量很大将导致效率低下。既然可以得到当前对象所位于的层的信息就也是这树倒置的树是一层一层向下填充的我们可以定义一个临时集合变量存储当前层上一层的所有父对象在插入当前层对象时遍历集合变量以插入到合适的位置同时我们还必须保证在逐层读取数据时临时集合变量中持有的始终时当前层上一层所有的对象程序流程图如下所示 根据以上分析我们就可以编写实现代码了为了方便将本文中用到的数据表和创建记录等SQL语句一并给出。 3. 实现 3.1 打开SQL Server 2005 Management Studio选择某个数据库输入以下语句创建表结构 CREATE TABLE [tb_loc]([id] [int],[name] [varchar](16),[parent] [int] )GO 3.2 创建测试数据 INSERT tb_loc(id,name,parent) VALUES( 1,河北省,NULL) INSERT tb_loc(id,name,parent) VALUES( 2,石家庄,1) INSERT tb_loc(id,name,parent) VALUES( 3,保定,1) INSERT tb_loc(id,name,parent) VALUES( 4,山西省,NULL) INSERT tb_loc(id,name,parent) VALUES( 5,太原,4) INSERT tb_loc(id,name,parent) VALUES( 6,新华区,2) INSERT tb_loc(id,name,parent) VALUES( 7,北焦村,6) INSERT tb_loc(id,name,parent) VALUES( 8,大郭村,6) INSERT tb_loc(id,name,parent) VALUES( 9,河南省,NULL) INSERT tb_loc(id,name,parent) VALUES( 10,大郭村南,8) INSERT tb_loc(id,name,parent) VALUES( 11,大郭村北,8) INSERT tb_loc(id,name,parent) VALUES( 12,北焦村东,7) INSERT tb_loc(id,name,parent) VALUES( 13,北焦村西,7) INSERT tb_loc(id,name,parent) VALUES( 14,桥东区,3) INSERT tb_loc(id,name,parent) VALUES( 15,桥西区,3) GO3.3 创建pr_GetLocations存储过程 CREATE PROCEDURE pr_GetLocations AS BEGINWITH locs(id,name,parent,loclevel)AS(SELECT id,name,parent,0 AS loclevel FROM tb_locWHERE parent IS NULLUNION ALLSELECT l.id,l.name,l.parent,loclevel1 FROM tb_loc l INNER JOIN locs p ON l.parentp.id)SELECT * FROM locs END 3.4 在Visual Studio 2008里创建解决方案并新建一个网站。 3.5 在网站中添加APP_Code目录并创建Location实体类该类标识了所在地编号和名称并且保存了父级所在地编号和它所包含的所有子所在地的集合 public class Location {public int Id{get;set;}public string Name{get;set;}public LocationCollection SubLocations{get;set;}public int ParentId{get;set;}public Location(){Id 0;Name string.Empty;SubLocations new LocationCollection();ParentId0;} } 3.5 以上代码使用了LocationCollection集合类使用泛型集合创建该类同样位于APP_Code目录下 using System.Collections.Generic;public class LocationCollection:ListLocation {} 3.6 在APP_Code目录下创建DAO类用于访问数据库添加必要的命名空间引用 using System; using System.Data; using System.Data.SqlClient;public class DAO { } 3.7编写GetLocations方法返回所在地集合对象请根据实际情况修改数据库连接字符串 public LocationCollection GetLocations() {LocationCollection locs new LocationCollection();using (SqlConnection conn newSqlConnection(server.;uidsa;pwd00000000;databasetemp;)){conn.Open();SqlCommand cmd new SqlCommand();cmd.CommandText pr_GetLocations;cmd.CommandType CommandType.StoredProcedure;cmd.Connection conn;SqlDataReader reader cmd.ExecuteReader();int level 0;int oldlevel 1;LocationCollection containernew LocationCollection();LocationCollection current new LocationCollection();while (reader.Read()){Location loc GetLocationFromReader(reader, out level);if (level 0){locs.Add(loc);container.Add(loc); }else{if (oldlevel ! level){container.Clear();foreach (Location l in current)container.Add(l);current.Clear();oldlevel level;}current.Add(loc);CreateLocation(container, loc);} }}return locs; } 在该方法按照以下步骤执行 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;}} } 3.10 向Default.aspx页面上添加TreeView控件 asp:TreeView IDtrvLocation runatserver Font-Size12pxShowLinesTrue /asp:TreeView 3.11 在Default.aspx页面后置代码中编写BindData数据绑定方法 private void BindData() {DAO dao new DAO();LocationCollection locs dao.GetLocations();TreeNodeCollection nodes CreateTreeNodes(locs);foreach (TreeNode node in nodes){trvLocation.Nodes.Add(node);} } 3.12 BindData方法调用了CreateTreeNode方法返回节点集合该方法中递归调用自身以得到全部所在地节点 private TreeNodeCollection CreateTreeNodes(LocationCollection locs) {TreeNodeCollection nodeColl new TreeNodeCollection();foreach (Location loc in locs){TreeNode node new TreeNode(loc.Name, loc.Id.ToString());if (loc.SubLocations.Count 0){TreeNodeCollection subColl CreateTreeNodes(loc.SubLocations);foreach (TreeNode subNode in subColl)node.ChildNodes.Add(subNode);}nodeColl.Add(node);}return nodeColl; } 3.13 最后在页面加载事件里执行数据绑定 protected void Page_Load(object sender, EventArgs e) {if (!IsPostBack){this.BindData();} } 3.14 在浏览器中预览结果 4. 总结 原来在处理类似父子关系时总是找不到好的解决办法现在通过SQL Server 2005里的新特性可以较为合理的解决该类问题在这里主要用到了with关键字实现递归访问并且在输出数据时同样使用了递归的方法。如果各位有更好的实现方式请不不吝赐教。 本文示例代码下载示例代码 感谢各位支持在SQL Server Management Studio中抓取了查询单表和以上算法的执行计划供大家参考吧 1.select * from tb_loc 2. exec pr_GetLocations   转自http://www.cnblogs.com/holywolf/archive/2008/12/22/1359546.html 转载于:https://www.cnblogs.com/suzh/archive/2012/11/01/2749512.html
http://www.zqtcl.cn/news/642260/

相关文章:

  • 金融网站html5模板给自己家的公司做网站好做吗
  • 新农村建设投诉在哪个网站上海做电缆桥架的公司网站
  • 免费行情100个软件网络优化论文
  • asp.net动态的网站开发个人业务网站带后台
  • 控制网站的大量访问关于实验室建设的英文网站
  • 中国容桂品牌网站建设怎么自己做个网站做链接跳转
  • 安徽省建设工程协会网站昆明官网seo厂家
  • 品牌整合推广搜狗优化好的网站
  • 娄底手机网站制作深圳网站建设怎么做
  • 好的龙岗网站建设附近装修公司电话和地址
  • 网站后台生成文章很慢网络营销毕业设计
  • 如何把资料上传到网站什么叫高端网站定制
  • 郑州企业网站建设团队什么是交换链接
  • 如何建立一个外贸公司网站活动营销的方式有哪些
  • 上海工程造价咨询公司余姚网站seo运营
  • 小加工厂做网站wordpress免费主题破解版
  • 网站打开风险怎么解决企业建设网站网站建设公司
  • 随州网站建设公司wordpress怎样上传主题
  • 做外链等于网站更新么台州椒江网站建设
  • 自己搭建一个博客网站网络营销是什么大类
  • 10元网站备案php企业网站开发实训报告
  • 建筑网站设计大全wordpress模板死循环
  • 网站优化排名软件泌阳网站建设
  • 网站反向绑定域名企业网站的建立网络虚拟社区时对于企业
  • 重庆大渡口网站建设解决方案梓潼 网站建设 有限公司
  • 高端平面网站东营住房和城乡建设厅网站
  • 品牌网站建设e小蝌蚪易时代网站
  • 做搜狗手机网站点击软网站建设有哪些种类
  • 想自学做网站太原要做网站的公司
  • 站内seo优化淘宝网站推广策划方案