当前位置:文档之家› TREE采用左右值编码来存储无限分级树形结构的数据库

TREE采用左右值编码来存储无限分级树形结构的数据库

TREE采用左右值编码来存储无限分级树形结构的数据库
TREE采用左右值编码来存储无限分级树形结构的数据库

采用左右值编码来存储无限分级树形结构的数据库表设计

之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:浅谈数据库设计技巧(上)

该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超过最大限制。

上面的设计方案必须预先设定类别树的最大层数以及最大子节点数,不是无限分级,在某些场合并不能采用,那么还有更完美的解决方案吗?通过google的搜索,我又探索到一种全新的无递归查询,无限分级的编码方案——左右值。原文的程序代码是用php写的,但是通过仔细阅读其数据库表设计说明及相关的sql语句,我彻底弄懂了这种巧妙的设计思路,并在这种设计中新增了删除节点,同层平移的需求(原文只提供了列表及插入子节点的sql语句)。

下面我力图用比较简短的文字,少量图表,及相关核心sql语句来描述这种设计方案:

首先,我们弄一棵树作为例子:

商品

|---食品

| |---肉类

| | |--猪肉

| |---蔬菜类

| |--白菜

|---电器

|--电视机

|--电冰箱

select count(*) from tree where lft <= 2 and rgt >= 11

为了方便列表,我们可以为tree表建立一个视图,添加一个层数列,该类别的层数可以写一个自定义函数来计算。该函数如下:

CREATE FUNCTION dbo.CountLayer

(

@type_id int

)

RETURNS int

AS

begin

declare@result int

set@result=0

declare@lft int

declare@rgt int

if exists (select1from tree where type_id=@type_id)

begin

select@lft=lft,@rgt=rgt from tree where type_id=@type_id

select@result=count(*) from tree where lft <=@lft and rgt >=@rgt

end

return@result

end

GO

然后,我们建立如下视图:

CREATE VIEW dbo.TreeView

AS

SELECT type_id, name, lft, rgt, dbo.CountLayer(type_id) AS layer FROM dbo.tree ORDE R BY lft

GO

(

)

AS declare declare if

go

假定我们要在节点“肉类”下添加一个子节点“牛肉”,该树将变成:

1商品18+2

+--------------------------------------------+

2食品11+2 12+2电器17+2

+-----------------+ +-------------------------+

3肉类6+2 7+2蔬菜类10+2 13+2电视机14+2 15+2电冰箱16+2 +-------------+

4猪肉5 6牛肉78+2白菜9+2

看完上图相应节点左右值的变化后,相信大家都知道该如何写相应的sql脚本吧?下面我给出相对完整的插入子节点的存储过程:

CREATE PROCEDURE[dbo].[AddSubNodeByNode]

(

@type_id int,

@name varchar(50)

)

AS

declare@rgt int

if exists (select1from tree where type_id=@type_id)

begin

SET XACT_ABORT ON

BEGIN TRANSACTION

select@rgt=rgt from tree where type_id=@type_id

update tree set rgt=rgt+2where rgt>=@rgt

update tree set lft=lft+2where lft>=@rgt

insert into tree (name,lft,rgt) values (@name,@rgt,@rgt+1)

COMMIT TRANSACTION

SET XACT_ABORT OFF

end

然后,我们删除节点“电视机”,再来看看该树会变成什么情况:

1商品20-2

+-----------------------------------+

2食品13 14电器19-2

+-----------------+

3肉类8 9蔬菜类12 17-2电冰箱18-2

+----------+

4猪肉5 6牛肉7 10白菜11

相应的存储过程如下:

CREATE PROCEDURE[dbo].[DelNode]

@type_id int

AS

declare@lft int

declare@rgt int

if exists (select1from tree where type_id=@type_id)

begin

SET XACT_ABORT ON

BEGIN TRANSACTION

select@lft=lft,@rgt=rgt from tree where type_id=@type_id

delete from tree where lft>=@lft and rgt<=@rgt

update tree set lft=lft-(@rgt-@lft+1) where lft>@lft

update tree set rgt=rgt-(@rgt-@lft+1) where rgt>@rgt

COMMIT TRANSACTION

SET XACT_ABORT OFF

End

注意:因为删除某个节点会同时删除该节点的所有子孙节点,而这些被删除的节点的个数为:(被删节点的右值-被删节点的左值+1)/2,而任何一个节点同时具有唯一的左值和唯一的右值,故删除作废节点后,其他相应节点的左、右值需要调整的幅度应为:减少(被删节点的右值-被删节点的左值+1)。

最后,让我们看看平移节点“电器”,将其和其所有子孙节点移动到节点“食品”之前后,该树会变成什么情况:

1商品18

+-----------------------------------+

14-12电器17-12 2+4食品13+4

+----------------------+ 15-12电冰箱16-12 3+4肉类8+4 9+4蔬菜类12+4

+-------------------+

4+4猪肉5+4 6+4牛肉7+4 10+4白菜11+4

大家仔细观察一下交换后同层2个节点和其所有子孙节点左右值的变化,可以发现一个明显的规律,那就是,节点“电器”及其所有子孙节点的左右值均减少12,而节点“食品”及其所有子孙节点的左右值均增加4。而节点“电器”+其子孙节点的数量为2,节点“食品”+其子孙节点的数量为6,这其中有什么联系吗?还记得我在删除节点的存储过程后面的注释吗?任何一个节点同时具有唯一的左值和唯一的右值。让我们把节点数量*2,正好和节点左右值需要调整的幅度相等。由此规律,我们可以编写出类似下面的存储过程来实现节点同层前移的功能:

CREATE PROCEDURE[dbo].[MoveNodeUp]

@type_id int

AS

declare@lft int

declare@rgt int

declare@layer int

if exists (select1from tree where type_id=@type_id)

begin

SET XACT_ABORT ON

BEGIN TRANSACTION

select@lft=lft,@rgt=rgt,@layer=layer from TreeView where type_id=@type_id

if exists (select*from TreeView where rgt=@lft-1and layer=@layer)

begin

declare@brother_lft int

declare@brother_rgt int

select@brother_lft=lft,@brother_rgt=rgt from TreeView where rgt=@lft-1an d layer=@layer

update tree set lft=lft-(@brother_rgt-@brother_lft+1) where lft>=@lft and rgt <=@rgt

update tree set lft=lft+(@rgt-@lft+1) where lft>=@brother_lft and rgt<=@br other_rgt

update tree set rgt=rgt-(@brother_rgt-@brother_lft+1) where rgt>@brother_ rgt and rgt<=@rgt

update tree set rgt=rgt+(@rgt-@lft+1) where lft>=@brother_lft+(@rgt-@lft+ 1) and rgt<=@brother_rgt

end

COMMIT TRANSACTION

SET XACT_ABORT OFF

end

注意:节点的同层平移可以采用临时表来做中介,降低代码的复杂度。不用临时表来处理也行,但是update语句顺序一定要考虑周详。否则,一旦出现bug,对整个类别表的破坏是惊人的,强烈推荐在做上述工作前对类别表进行完整备份。

同层下移的存储过程和同层上移类似,有兴趣的朋友可以自己动手编写体味一下其中的细节,我就不在这里列出来了。

最后,我对上面这种左右值编码实现无限分级类别树的方案做一个总结:

优点:在消除递归的前提下实现了无限分级,而且查询条件是基于整形数字比较的,效率很高。可以进行先序列表,添加,修改,删除,同层平移等常规操作,基本满足需求。

缺点:由于这种左右值编码的方式和常见的阿拉伯数字直观排序不同,再加上节点在树中的层次,顺序不是直观显示出来,而必须通过简单的公式计算后得到,需要花费一定的时间对其数学模型进行深入理解。而且,采用该方案编写相关存储过程,新增,删除,同层平移节点需要对整个树进行查询修改,由此导致的代码复杂度,耦合度较高,修改维护的风险较高。

发表于@ 2007年04月26日16:36:00|评论(4 )|编辑

新一篇: 自定义MembershipProvider来利用https://www.doczj.com/doc/2c16368543.html, 2.0 Login控件的登陆和修改密码模块 | 旧一篇: 分页存储过程的一点心得

老板心里你有多重?

确立职场位置,明确自身重要性Leo教你看清前途

老板心里你有多重?

确立职场位置,明确自身重要性Leo教你看清前途

评论

#hometohome 发表于2008-05-07 22:17:19 IP: 123.115.4.*

请问该如何根据子节点的type_id找出父节点呢?

比如:猪肉的父节点是肉类、食品、商品

#hometohome 发表于2008-05-07 22:38:54 IP: 123.115.4.*

declare @rgt int

select @rgt=rgt from tree where type_id=13

select * from tree where rgt>=@rgt and lft<=@rgt order by lft

我是楼上的。这么做可否?

#greki 发表于2008-10-11 17:49:40 IP: 125.122.194.*

非常感谢,试过很好用,

另外我不懂存储过程,

CREATE PROCEDURE [dbo].[GetTreeListByNode]

(

@type_id int --给定节点标识

)

AS

declare @lft int

declare @rgt int

if exists (select 1 from tree where type_id=@type_id)

begin

select @lft=lft,@rgt=rgt from tree where type_id=@type_id

select * from TreeView where lft between @lft and @rgt order by lft asc

end

go

这个改为返回结果集。select * from TreeView where lft between @lft and @rgt

order by lft asc

。怎么改

#Binlorima 发表于2008-11-17 16:08:20 IP: 220.231.42.*

看到你的这篇文章后,我有以下想法:

数据库结构:

id name index layer

---- --------- --------- -------

1 食品1 2

2 肉类2 3

3 猪肉3 4

4 蔬菜类4 3

5 白菜5 4

6 电器6 2

7 电视机7 3

8 电冰箱8 3

layer 1 2 3 4

————————————

index

1 |---食品

2 | |---肉类

3 | | |--猪肉

4 | |---蔬菜类

5 | |--白菜

6 |---电器

7 |--电视机

8 |--电冰箱

我认为这样存储更直观

而且不需要计算层级,更容易得出父节点及直接父节点

数据库复习题汇总

单元练习 一单项选择题 1.文件系统与数据库系统相比较,其缺陷主要表现在数据联系弱、数据冗余和()。 A.数据存储低 B.处理速度慢 C.数据不一致 D.操作烦琐 2.数据的存储结构与数据逻辑结构之间的独立性称为数据的()。 A.结构独立性 B.物理独立性 C.逻辑独立性 D.分布独立性 数据存储结构:即内模式。 数据逻辑结构:即模式 用户视图:即外模式 3.在数据库系统中,对数据操作的最小单位是()。 A.字节 B.数拯项 C.记录 D.字符 4.数据的逻辑结构与用户视图之间的独立性称为数据的()。 A.结构独立性 B.物理独立性 C.逻辑独立性 D.分布独立性 5.下述各项中,属于数据库系统的特点的是()。 A.存储量大 B.存取速度快 C.数据共享 D.操作方便 6.在数据库系统中,模式/内模式映像用于解决数据的()。 A.结构独立性 B.物理独立性 C.逻辑独立性 D.分布独立性 7.在数据库系统中,模式/外模式映像用于解决数据的()。 A.结构独立性 B.物理独立性 C.逻辑独立性 D.分布独立性 8.数据库结构的描述,称为()。 A.数据库模型 B.数据库 C.数据库管理系统 D.数据字典 数据库模型有层次模型网状和关系模型 9.数据库中全体数据的逻辑结构描述称为( A. 存储模式 B.内模式 C.外模式 D.模式 10.保证数摇库中数摇及语义的正确性和有效性,是数据库的()。 A.完全性 B.准确性 C.完整性 D.共享性 11.在数据库系统中,数据独立性是指()。 A.用户与计算机系统的独立性 B.数据库与il?算机的独立性 C.数据勺应用程序的独立性 D.用户与数摇库的独立性 12.结构数据模型的三个组成部分是数据结构、数据操作和()。 A.数据安全性控制 B.数摇一致性规则 C.数^]^完整性约束 D.数摇处理逻辑 13.在数据操纵语言(DML)的基本功能中,不包括的是()。 A.插入新数据 B.描述数据库结构 C.对数据库中数据排序 D.删除数据库中数据 14.控制数摇库整体结构、负责数据库物理结构和逻辑结构的注义打修改的人员是()。 A.系统分析员 B.应用程序员 C.专业用户 D.数据库管理员 15.K列关于数据库系统正确的叙述是()。 A.数据库系统比文件系统存储数据量大 B.数据库系统中数据存储没有冗余 C.数据库系统中数据存储冗余较小 D.数据库系统比文件系统存取速度快 16.在数据库中,发生数据不一致现象的根本原因是()。 A.数据存储量太大 B.数摇安全性差 C.数据相互关系复杂 D.数据冗余 17.层次型、网状型和关系型数据模型的划分根据是()。 A.数据之间联系方式 B.数据之间联系的复杂程度

TreeView绑定SQL数据源

使用TreeView绑定SQL数据源 这里采用了在页面一loading就把数据绑到TreeView的各节点的方式,而不是在展开时再作子节点的绑定,因此在点击父节点时就不会有刷新的感觉了。呵呵,代码并没优化....... aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> 树形节点绑定

.cs文件: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; public partial class Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindTree(); } } public void BindTree() { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CreativeConnectionString"].Connectio

[考研类试卷]计算机专业基础综合(存储器系统的层次结构)模拟试卷2.doc

[考研类试卷]计算机专业基础综合(存储器系统的层次结构)模拟试卷 2 一、单项选择题 1-40小题,每小题2分,共80分。下列每题给出的四个选项中,只有一个选项是最符合题目要求的。 1 下列关于DRAM和SRAM的说法中,错误的是( )。 Ⅰ.SRAM不是易失性存储器,而DRAM是易失性存储器 Ⅱ.DRAM比SRAM集成度更高,因此读写速度也更快 Ⅲ.主存只能由DRAM构成,而高速缓存只能由SRAM构成 Ⅳ.与SRAM相比,DRAM由于需要刷新,所以功耗较高 (A)Ⅱ、Ⅲ和Ⅳ (B)Ⅰ、Ⅲ和Ⅳ (C)Ⅰ、Ⅱ和Ⅲ (D)Ⅰ、Ⅱ、Ⅲ和Ⅳ 2 某机字长32位,主存容量1 MB,按字编址,块长512 B,Cache共可存放16个块,采用直接映射方式,则Cache地址长度为( )。 (A)11位 (B)13位 (C)18位 (D)20位 3 在Cache和主存构成的两级存储体系中,Cache的存取时间是100ns,主存的存取时间是1000ns。如果希望有效(平均)存取时间不超过(;ache存取时间的15%,则Cache的命中率至少应为( )。

(A)90% (B)98% (C)95% (D)99% 4 下列关于Cache写策略的论述中,错误的是( )。 (A)全写法(写直达法)充分保证Cache与主存的一致性 (B)采用全写法时,不需要为Cache行设置“脏位/修改位” (C)写回法(回写法)降低了主存带宽需求(即减少了Cache与主存之间的通信量) (D)多处理器系统通常采用写回法 5 假定用若干个8K×8位的芯片组成一个32K×32位的存储器,则地址41FDH所在芯片的最大地址是( )。 (A)0000H (B)4FFFH (C)5FFFH (D)7FFFH 6 某机器采用四体低位交叉存储器,现分别执行下述操作: (1)读取6个连续地址单元中存放的存储字,重复80次; (2)读取8个连续地址单元中存放的存储字,重复60次; 则(1)、(2)所花时间之比为( )。 (A)1:1

采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树

摘要:采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树, 支持勾选。勾选父节点,子节点回全部自动勾选;子节点部分勾选时,父节点半勾选;子节点全部勾选时,父节点勾选。反之亦然。 HierarchicalDataTemplate是分层数据模板,通常用于tree,menu等层级控件。 HierarchicalDataTemplate的ItemsSource属性绑定下一级数据源。 Model为行政区数据实体类,通常访问数据库获取数据并构建对象。 ViewModel为界面的抽象模型,表示界面的数据和行为,是Model和View的桥梁。 view就是界面。 一、代码 1、Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace WpfHierarchicalTemplate { public class District { public int ID { get; set; } public string Xzqhdm { get; set; }//行政区划代码 public string Xzqhmc { get; set; }//行政区划名称 public int Level { get; set; }//级别,0全国,1省,2地市,3县,4,乡镇,5,村 public IList Children { get; set; } public District Parent { get; set; } } } 2、ViewModel using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.ObjectModel; using System.Windows.Media; using System.Windows.Media.Imaging; namespace WpfHierarchicalTemplate { publicclass DistrictNodeViewModel :ModelCommon.NotifyObject { privatebool? isSelected = false; publicbool? IsSelected { get{ return isSelected; } set { isSelected = value; RaisePropertyChanged("IsSelected");

第3章习题--存储系统

第3章存储系统 一.判断题 1.计算机的主存是由RAM和ROM两种半导体存储器组成的。 2.CPU可以直接访问主存,而不能直接访问辅存。 3.外(辅)存比主存的存储容量大、存取速度快。 4.动态RAM和静态RAM都是易失性半导体存储器。 5.Cache的功能全部由硬件实现。 6.引入虚拟存储器的目的是为了加快辅存的存取速度。 7.多体交叉存储器主要是为了解决扩充容量的问题。 8.Cache和虚拟存储器的存储管理策略都利用了程序的局部性原理。 9.多级存储体系由Cache、主存和辅存构成。 10.在虚拟存储器中,当程序正在执行时,由编译器完成地址映射。 二.选择题 1.主(内)存用来存放。 A.程序 B.数据 C.微程序 D.程序和数据 2.下列存储器中,速度最慢的是。 A.半导体存储器 B.光盘存储器 C.磁带存储器 D.硬盘存储器 3.某一SRAM芯片,容量为16K×1位,则其地址线有。 A.14根 B.16K根 C.16根 D.32根 4.下列部件(设备)中,存取速度最快的是。 A.光盘存储器 B.CPU的寄存器 C.软盘存储器 D.硬盘存储器 5.在主存和CPU之间增加Cache的目的是。 A.扩大主存的容量 B.增加CPU中通用寄存器的数量 C.解决CPU和主存之间的速度匹配 D.代替CPU中的寄存器工作 6.计算机的存储器采用分级存储体系的目的是。 A.便于读写数据 B.减小机箱的体积 C.便于系统升级 D.解决存储容量、价格与存取速度间的矛盾 7.相联存储器是按进行寻址的存储器。 A.地址指定方式 B.堆栈存取方式 C.内容指定方式 D.地址指定与堆栈存取方式结合 8.某SRAM芯片,其容量为1K×8位,加上电源端和接地端后,该芯片的引出线的最少数目应为。 A.23 B.25 C.50 D.20 9.常用的虚拟存储器由两级存储器组成,其中辅存是大容量的磁表面存储器。 A.主存—辅存 B.快存—主存 C.快存—辅存 D.通用寄存器—主存 10.在Cache的地址映射中,若主存中的任意一块均可映射到Cache内的任意一快的位置上,则这种方法称为。 A.全相联映射 B.直接映射 C.组相联映射 D.混合映射 三.填空题

数据库的体系结构

数据库基础 ( 视频讲解:25分钟) 本章主要介绍数据库的相关概念,包括数据库系统的简介、数据库的体系结构、数据模型、常见关系数据库。通过本章的学习,读者应该掌握数据库系统、数据模型、数据库三级模式结构以及数据库规范化等概念,掌握常见的关系数据库。 通过阅读本章,您可以: 了解数据库技术的发展 掌握数据库系统的组成 掌握数据库的体系结构 熟悉数据模型 掌握常见的关系数据库 1 第 章

1.1 数据库系统简介 视频讲解:光盘\TM\lx\1\数据库系统简介.exe 数据库系统(DataBase System,DBS)是由数据库及其管理软件组成的系统,人们常把与数据库有关的硬件和软件系统称为数据库系统。 1.1.1 数据库技术的发展 数据库技术是应数据管理任务的需求而产生的,随着计算机技术的发展,对数据管理技术也不断地提出更高的要求,其先后经历了人工管理、文件系统、数据库系统等3个阶段,这3个阶段的特点分别如下所述。 (1)人工管理阶段 20世纪50年代中期以前,计算机主要用于科学计算。当时硬件和软件设备都很落后,数据基本依赖于人工管理,人工管理数据具有如下特点: ?数据不保存。 ?使用应用程序管理数据。 ?数据不共享。 ?数据不具有独立性。 (2)文件系统阶段 20世纪50年代后期到60年代中期,硬件和软件技术都有了进一步发展,出现了磁盘等存储设备和专门的数据管理软件即文件系统,文件系统具有如下特点: ?数据可以长期保存。 ?由文件系统管理数据。 ?共享性差,数据冗余大。 ?数据独立性差。 (3)数据库系统阶段 20世纪60年代后期以来,计算机应用于管理系统,而且规模越来越大,应用越来越广泛,数据量急剧增长,对共享功能的要求越来越强烈。这样使用文件系统管理数据已经不能满足要求,于是为了解决一系列问题,出现了数据库系统来统一管理数据。数据库系统满足了多用户、多应用共享数据的需求,它比文件系统具有明显的优点,标志着管理技术的飞跃。 1.1.2 数据库系统的组成 数据库系统是采用数据库技术的计算机系统,是由数据库(数据)、数据库管理系统(软件)、数

计算机专业基础综合(存储器系统的层次结构)-试卷1

计算机专业基础综合(存储器系统的层次结构)-试卷1 (总分:72.00,做题时间:90分钟) 一、单项选择题(总题数:24,分数:48.00) 1.单项选择题1-40小题。下列每题给出的四个选项中,只有一个选项是最符合题目要求的。 __________________________________________________________________________________________ 2.下列关于存储系统层次结构的说法中,不正确的是( )。 A.存储层次结构中,离CPU越近的存储器速度越快,价格越贵,容量越小 B.Cache-主存层次设置的目的是为了提高主存的等效访问速度 C.主存一辅存层次设置的目的是为了提高主存的等效存储容量 D.存储系统层次结构对程序员都是透明的√ 此题考查的知识点:存储系统层次结构的基本概念。Cache-主存层次对所有程序员都是透明的。主存一辅存层次只对应用程序员透明,对系统程序员不透明。 3.存储器的存取周期与存储器的存取时间的关系是( )。 A.存取周期大于存取时间√ B.存取周期等于存取时间 C.存取周期小于存取时间 D.存取周期与存取时间关系不确定 此题考查存储器存取周期与存取时间的概念及其关系。存取周期是存储器进行连续地读或写操作允许的最短时间间隔,存取时间是存储器进行一次读或写操作所需的平均时间。 4.以下几种存储器中,存取速度最快的是( )。 A.Cache B.寄存器√ C.内存 D.光盘 存储层次结构中,离CPU越近的存储器速度越快,价格越贵,容量越小。寄存器就是离CPU最近的存储器。 5.属于易失性存储器的是( )。 A.E 2 PROM B.Cache √ C.Flash Memory D.CD-ROM 易失性存储器包括Cache。 6.虚拟存储器理论上的最大容量取决于( )。 A.辅存容量 B.主存容量 C.虚地址长度√ D.实地址长度 虚地址和实地址是虚拟存储器的两个基本概念,虚拟存储器的最大容量取决于虚地址长度,主存储器的最大容量取决于实地址长度。 7.下列存储保护方案中,不是针对“地址越界”访存违例的是( )。 A.界限保护 B.键保护 C.环保护 D.设置访问权限位√ 设置访问权限位是针对“访问越权”访存违例的。 8.下列关于DRAM刷新的说法中,错误的是( )。 A.刷新是指对DRAM中的存储电容重新充电 B.刷新是通过对存储单元进行“读但不输出数据”的操作来实现

数据库的存储结构(文件、记录的组织和索引技术)

数据库的存储结构(文件、记录的组织和索引技术) by 沈燕然0124141 利用课余时间自学了第6章《数据库存储结构》,对于数据 库不同层次的存储结构,文件记录组织和索引技术有了一定的 了解,在这篇札记中将会结合一些具体应用中涉及到的数据存 储和索引知识,以及通过与过去学习过的一些数据结构比较来 记录自己学习的心得体会。这些实例涉及不同的数据库系统, 如Oracle, DB2和Mysql等等,它们之间会有一些差异。不过 本文旨在探讨数据存储方面的问题,因而兼容并包地将其一并收入,凡是可能需要说明之处都会加上相应的注解。:) 1、数据库(DBS)由什么组成?——逻辑、物理和性能特征 1、什么是数据库系统(DBS)——DBS用文件系统实现 在关系模型中,我们把DBS看成关系的汇集。DBS存在的目的就是为了使用户能够简单、方便、容易地存取数据库中的数据。因此在用户的眼中,数据库也就是以某种方式相关的表的集合。用户并不需要去关心表之间关系,更不需要了解这些表是怎样存储的。但是我们现在从DBA(数据库管理员)的角度来看,情况就比那稍稍复杂一点。 实际的数据库包含许多下面列出的物理和逻辑对象: ?表、视图、索引和模式(确定数据如何组织) ?锁、触发器、存储过程和包(引用数据库的物理实现) ?缓冲池、日志文件和表空间(仅处理如何管理数据库性能) 2、什么是表空间?——表空间相当于文件系统中的文件夹。 表空间被用作数据库和包含实际表数据的容器对象之间的一层,表空间可以包含多个不同的表。用户处理的实际数据位于表中,他们并不知道数据的物理表示,这种情况有时被称为数据的物理无关性。

上图描述了一个ORACLE数据库大致的表空间组织,USER中存放主要的数据表,TEMP存放临时数据表,INDX存放索引,TOOLS存放回退段(RBS). 表空间在DB2数据库系统中是比较典型的说法,在Mysql等系统中也直接使用文件系统中文件夹的概念。新建一个表的时候可以指定它所在的表空间,至于用文件具体存储数据时如何存储这可能就是各个数据库系统的商业机密了,至少DB2是这样。另外值得关注的一点是不同于oracles对表空间的严格要求,Mysql的数据库形式相对比较简单,以文件夹的形式存放在安装目录的/data/下面,该数据库的每一个表对应两个文件,一个存放表中数据,另一个存放元数据信息,也就是建表时指明的列属性等等信息。 3、文件中的记录在物理上如何实现?——文件组织形式 在外存中,DB以文件形式组织,而文件由记录组成。文件结构由OS的文件系统提供和管理。文件组织有两种方式——定长记录格式和变长记录格式。 那种格式更好? 定长记录格式——优点是插入操作较简单。 缺点是对记录长度有硬性要求,而且有的记录可能横跨多个快,降低读写效率。 变长记录格式——优点是记录长度自由方便 缺点是记录长度差异导致删除后产生大量“碎片”,记录很难伸长,尤其“被拴记录”移动代价相当大。 中庸之道——预留空间和指针方式 记录长度大多相近——采用预留空间方法,取最大记录长为统一标准,在短记录多于空间处填特定空值或记录尾标志符。 记录长度相差很大——采用指针形式(每纪录后的指针字段把相同属性值记录链接起来)。文件中使用两种块——固定块(存放每条链中第一条记录)和溢出块(存放其 余纪录)。 3、记录在文件中怎样组织?

C# 里TreeView绑定数据库实现分类

C# 里TreeView绑定数据库实现分类 分类:导航控件TreeView/Menu/SiteMapPath 2010-03-22 21:33 45人阅读评论(0) 收藏举报 codes=c#] //从数据库中读取数据 SqlConnection con = new SqlConnection("server=127.0.0.1//sqlexpress;uid=sa;"); con.Open(); con.ChangeDatabase("STggggg"); SqlCommand cmd = new SqlCommand("select * from 产品树where NodeType='f'", con); //https://www.doczj.com/doc/2c16368543.html,mandType = CommandType.StoredProcedure; SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); try { sda.Fill(ds); } catch { } finally { cmd = null; con.Close(); } //往TreeView中添加树节点 //添加根节点 TreeNode tn = new TreeNode(); tn.Text = "所有产品"; https://www.doczj.com/doc/2c16368543.html, = "0";//Name作为ID tn.Tag = "0";//Tag作为RootID tn.ImageIndex = 0; tn.SelectedImageIndex = 0; tv.Nodes.Add(tn);//该TreeView命名为tv tv.SelectedNode = tv.TopNode;

第7章 存储器分层体系结构 复习要点

第7章存储器分层体系结构复习要点 一、存储器概述和存储器芯片 1. 熟悉随机存取存储器、顺序存取存储器、直接存取存储器、相联存储器、只读存储器、读写存储器、非易失(不挥发)性存储器、易失(挥发)性存储器、静态存储器、动态存储器这些名称的含义。这些类型的存储器在计算机的层次结构存储系统中 按工作性质/存取方式分类: 随机存取存储器(RAM) :每个单元读写时间一样,且与各单元所在位置无关。如:内存。(注:原意主要强调地址译码时间相同。现在的DRAM芯片采用行缓冲,因而可能因为位置不同而使访问时间有所差别。) 顺序存取存储器(SAM):数据按顺序从存储载体的始端读出或写入,因而存取时间的长短与信息所在位置有关。例如:磁带。 直接存取存储器(DAM):直接定位到读写数据块,在读写数据块时按顺序进行。如磁盘。相联存储器(AM/CAM):按内容检索到存储位置进行读写。例如:快表。 按信息的可更改性分类: 读写存储器(Read / Write Memory):可读可写。 只读存储器(Read Only Memory):只能读不能写。 按断电后信息的可保存性分类: 非易失(不挥发)性存储器(Nonvolatile Memory) 信息可一直保留,不需电源维持。(如:ROM、磁表面存储器、光存储器等) 易失(挥发)性存储器(Volatile Memory) 电源关闭时信息自动丢失。(如:RAM、Cache)按功能/容量/速度/所在位置分类: 寄存器(Register)封装在CPU内,用于存放当前正在执行的指令和使用的数据;用触发器

实现,速度快,容量小(几~几十个)。 高速缓存(Cache)位于CPU内部或附近,用来存放当前要执行的局部程序段和数据;用SRAM实现,速度可与CPU匹配,容量小(几MB)。 内存储器MM(主存储器Main (Primary) Memory)位于CPU之外,用来存放已被启动的程序及所用的数据;用DRAM实现,速度较快,容量较大(几GB)。 外存储器AM (辅助存储器Auxiliary / Secondary Storage)位于主机之外,用来存放暂不运行的程序、数据或存档文件;用磁表面或光存储器实现,容量大而速度慢。 2. 层次结构存储系统中的寄存器、高速缓存、内存(主存)、外存它们所在的位置、工作速度、存储容量、成本等的相对大小和大致的数量级。这些存储器和前述各类存储器之间的对应关系。 3. 静态存储器和动态存储器的基本工作机制;动态存储器刷新的概念,按行刷新的含义。最大刷新周期的确定的依据是什么。DRAM的集中刷新、分散刷新和异步刷新的刷新操作与正常访存分别是如何安排的? 4. 了解SDRAM芯片中的突发传输方式 二、存储器容量的扩展及其与CPU的连接 1. 位扩展、字扩展、字位扩展方式,系统存储容量的计算,芯片数的计算,这几种扩展方式下的芯片(组)与片选信号的地址线分配,各芯片(组)的地址范围的计算、划分。片选信号用地址信号表示的逻辑表达式。 三、高速缓冲存储器(cache) 1. 直接映射、全相联映射、组相联映射三种方式映射关系;三种方式下的主存地址与cache 的行、内容之间的对应关系;cache容量的计算方法,注意区分数据区、标记、有效位。 2. CPU对cache的访问时,直接映射采用的是按地址进行查找的方法,而全相联映射采用

计算机组成原理题附答案

计算机组成原理题解指南 第一部分:简答题 第一章计算机系统概论 1.说明计算机系统的层次结构。 计算机系统可分为:微程序机器级,一般机器级(或称机器语言级),操作系统级,汇编语言级,高级语言级。 第四章主存储器 1.主存储器的性能指标有哪些?含义是什么? 存储器的性能指标主要是存储容量. 存储时间、存储周期和存储器带宽。 在一个存储器中可以容纳的存储单元总数通常称为该存储器的存储容量。 存取时间又称存储访问时间,是指从启动一次存储器操作到完成该操作所经历的时间。 存储周期是指连续两次独立的存储器操作(如连续两次读操作)所需间隔的最小时间。 存储器带宽是指存储器在单位时间中的数据传输速率。 2.DRAM存储器为什么要刷新?DRAM存储器采用何种方式刷新?有哪几种常用的刷新方式?DRAM存储元是通过栅极电容存储电荷来暂存信息。由于存储的信息电荷终究是有泄漏的,电荷数又不能像SRAM存储元那样由电源经负载管来补充,时间一长,信息就会丢失。为此必须设法由外界按一定规律给栅极充电,按需要补给栅极电容的信息电荷,此过程叫“刷新”。 DRAM采用读出方式进行刷新。因为读出过程中恢复了存储单元的MOS栅极电容电荷,并保持原单元的内容,所以读出过程就是再生过程。 常用的刷新方式由三种:集中式、分散式、异步式。 3.什么是闪速存储器?它有哪些特点? 闪速存储器是高密度、非易失性的读/写半导体存储器。从原理上看,它属于ROM型存储器,但是它又可随机改写信息;从功能上看,它又相当于RAM,所以传统ROM与RAM的定义和划分已失去意义。因而它是一种全新的存储器技术。 闪速存储器的特点:(1)固有的非易失性,(2)廉价的高密度,(3)可直接执行,(4)固态性能。4.请说明SRAM的组成结构,与SRAM相比,DRAM在电路组成上有什么不同之处? SRAM存储器由存储体、读写电路、地址译码电路、控制电路组成,DRAM还需要有动态刷新电路。 第五章指令系统 1.在寄存器—寄存器型,寄存器—存储器型和存储器—存储器型三类指令中,哪类指令的执行时间最长?哪类指令的执行时间最短?为什么? 寄存器-寄存器型执行速度最快,存储器-存储器型执行速度最慢。因为前者操作数在寄存器中,后者操作数在存储器中,而访问一次存储器所需的时间一般比访问一次寄存器所需时间长。2.一个较完整的指令系统应包括哪几类指令? 包括:数据传送指令、算术运算指令、逻辑运算指令、程序控制指令、输入输出指令、堆栈指令、字符串指令、特权指令等。 3.什么叫指令?什么叫指令系统? 指令就是要计算机执行某种操作的命令 一台计算机中所有机器指令的集合,称为这台计算机的指令系统。 第六章中央处理部件CPU 1.指令和数据均存放在内存中,计算机如何从时间和空间上区分它们是指令还是数据。 时间上讲,取指令事件发生在“取指周期”,取数据事件发生在“执行周期”。从空间上讲,从内存读出的指令流流向控制器(指令寄存器)。从内存读出的数据流流向运算器(通用寄存器)。

数据库的存储结构

第五章数据库的存储结构 5.1数据库存储介质的特点 ●内存 容量低(一般只有几百M,最多一两个G),价格高,速度快,数据易丢失(掉电、当机等)。 一般做DBMS(或CPU)和DB之间的数据缓冲区。 实时/内存数据库系统中使用内存存放实时数据。 ●硬盘 容量高(一般有几十G,多到一两百G),价格中,速度较快,数据不易丢失(除非物理性损坏)。 一般做用来存放DB。 实时/内存数据库系统中使用硬盘存放历史数据库。 ●移动硬盘(USB接口) 容量高(一般有几十G),价格中,速度较快,数据不易丢失(除非物理性损坏)。 一般做用来做备份。 ●光盘 容量低(一般650M/片,但光盘可在线更换,海量),价格低,速度中,数据不易丢失(除非物理性损坏)。 一般做用来做备份。 ●磁盘(软盘) 容量低(一般有几M,优盘多到一两百M),价格中,速度较慢,数据不易丢失(除非物理性损坏)。 一般数据库不使用磁盘。 ●磁带 容量低(但可在线更换,海量),价格低,速度最慢,且要按顺序存取,数据不易丢失(除非物理性损坏)。 一般做用来做备份。 按速度从高到低: 内存、硬盘、USB盘(移动硬盘和优盘)、光盘、软盘、磁带。 按在线容量从大到小: 硬盘、移动硬盘、内存、光盘、磁带、优盘、软盘。 物理块:512byte/1K/2K/4K/8K 原因: (1)减少I/O的次数; (2)减少间隙的数目,提高硬盘空间的利用率。 ORACLE逻辑块与物理块(init.ora中db_block_size定义逻辑块大小) 缓冲块和缓冲区(即SGA中的Data Buffer Cache) 延迟写(delayed write)技术/预取(Prefetching)技术(ORACLE中由DBWR进程完成数据的读写)

VB控件 treeview用法详解

VB TreeView控件使用详解 (2012-06-16 15:08:16) 标签:分类: 第一小时:学习直接用代码将数据填充到树控件中。 为什么要先学习直接用代码将数据填充到树控件中因为这种方法是最简单的,代码也最容易理解,学习树控件,先将这个学会,已经掌握了一半,所以先不要急着想怎么将表中的数据填充到树控件中,在第一小时里,树控件和表完全没有关系。 目的:我们要在树控件中建立如下的一个3层级关系 水果 | |__苹果 | |__红富士 | |__国光 | |__葡萄 |__红提子 |__青提子 解释:水果包含2种,一种是苹果,一种是葡萄,苹果又包含2种,一种是红富士,一种是国光,葡萄也如此。 在这里:“爷”是水果,“父”是苹果,葡萄,“子”是红富士,国光,红提子,青提子。概括如下: 爷(只能有一个):水果 父(这里有2个):父1:苹果;父2:葡萄

子(这里有4个):子1:红富士(父1苹果的子);子2:国光(父1苹果的子);子3:红提子(父2葡萄的子);子4:青提子(父2葡萄的子) 1、新建一个窗体,在窗体上放置两个控件,一个是Treeview,一个是Imagelist 如何找到这两个控件 Treeview控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Treeview Control,Version " Imagelist控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Imagelist Control,Version " Treeview控件大家都明白干什么用的,Imagelist控件是干什么用呢原来这个控件是放图标用的,如果你想在树控件中显示图标的,这个图标都将储存在ImageList控件中。 2、设置这两个控件的属性 首先要讲清楚控件的属性设置有2种,一种是设置这个控件在ACCESS中的属性,比如名称等。一种是设置这个控件本身的属性。要设置这个控件在ACCESS中的属性,选中控件后按鼠标右键选“属性”就可以了。跟我们平时设置文本框什么的一样。要设置这个控件本身的属性,只要双击这个控件就可以了。 1)设置Treeview控件在ACCESS中的名称属性,将名称设置为“Treeview" 2)设置Imagelist控件在ACCESS中的名称属性,将名称设置为“Image" 2)设置Imagelist控件本身的属性,双击控件后,在弹出来的设置框中选“Images",单击“Insert Picture"按钮,在你电脑中选择你需要的图标。在“Key:”栏中填入“K1”。其他默认设置不用改。3)设置Treeview控件本身的属性,双击控件后,在弹出来的设置框中选“General”,在这个选项面版中有很多项设置,大多数是设置树控件的显示格式,你自己慢慢研究。这里我们将第一项“Style"选7,在第五项“Imagelist"选项中将我们放置的Imagelist控件“Image"选上。这项设置就将图标和树控件联系了起来。 3、写代码将数据填充到树控件中

数据库的内存结构

系统全局区域(SGA) 大型池(Large Pool) 在SGA中大型池是可选的缓冲区。它可以根据需要有管理权进行配置。它可以提供一个大的区以供象数据库的备份与恢复等操作。 Oracle实例的内存结构组织包含在称为系统全局区域(System Global Area,SGA)的内存区域中。SGA在虚拟内存中进行分配,用于存放Oracle服务器进程。SGA内存结构组织包括共享池、数据库缓冲区高速缓存以及重做日志缓冲区,许多进程共享SGA。 1.共享池 共享池包括两个组件----库高速缓存和数据字典高速缓存。库高速缓存和数据字典高速缓存。库高速缓存储存当前最新使用的SQL语句及其执行计划。数据字典高速缓存则储存最新使用的数据字典信息,如表的定义、用户名和权限等。共享池的大小可以影响数据库的性能,在OLTP环境中更是如此。 2.数据库缓冲区高速缓存 当用户提交一个SQL查询时,为完成请求,服务器进程先查找数据库缓冲区高速缓存中的数据块。如果数据库缓冲区高速缓存中没有用户要求的数据块,那么服务器进程必须从物理设备中读取数据块,并在该缓冲区高速缓存中存放此数据的备份,这样,对相同数据块的后续请求就可以在内存中找到,而无需物理读取。 3.重做日志缓冲区 数据进行的所有更改都存储在重做日志缓冲区中,这些记录在以后会被拷贝到重做日志文件中。 程序全局区域(PGA) 程序全局区域(Program Global Area,PGA)是包含一个单个服务器进程数据的内存区域。在用于专门的服务器配置时,PGA由排序区域、会话信息、游标状态和堆栈空间组成。PGA在一个进程开始时进行分配,并在进程终止时释放。 数据库实例 为了访问数据库中的数据,Oracle使用一组为所有用户共享的后台进程。此外,还有一些存储结构(统称为系统全局区域)用来存储最近从数据库查询的数据。通过减少对数据库文件的I/O次数,这些存储区域可以改善数据库性能。 Oracle数据库实例通常称为数据库服务器,用来访问数据库文件集的存储结构及后台服务进程的集合。一个数据库可以被多个实例访问(对应于Oracle的并行服务器选项)。1.服务器启动和关闭 在用户能够操作Oracle数据库之前,必须先对数据库服务器执行一个启动操作。这个过程包括启动一个数据库实例、数据库实例挂上数据库和打开数据库。在服务器启动之后,数据库就可以被使用了。 相反,通过执行数据库服务器关闭操作,可以使一个数据库不可用。服务器关闭是服务器的反过程:首先要关闭数据库,然后从实例卸载数据库,最后关闭实例。在服务器关闭后,用户不能访问数据库,知道重新启动服务器才可以再次访问。 2.服务器连接 在一个Oracle实例启动并运行后,可以建立于服务器的连接来执行数据库工作。在后台,数据库实例工作机制负责完成用户请求。在同一时间,在保持数据库完整的同时,数据库实例自动地保护全部事务的工作。

vb TreeView 控件应用实例

vb TreeView 控件应用实例 2009-11-14 20:52 TreeView 控件应用实例:将 TreeView 绑定到 Biblio.mdb 数据库 应用示例:DataTree.vbp 本章的代码示例是从应用示例 DataTree.vbp which is listed in the Samples directory 中得到的。 可将数据库中的数据绑定到 TreeView 控件。下面的示例将 TreeView 控件绑定到 Biblio 数据库,该数据库可以在 Visual Basic CD 中找到。该应用实例将 Publishers 表作为树节点的第一层。如果一个出版商对应于一个或多个书名,则这些书名将作为该出版商的子节点加入树中。 图 2.42 与数据绑定的 TreeVew 控件 下面的代码用到了如下对象: Data Access Object Library(3.5) 名为“frmDataTree”的 Form 对象 名为“tvwDB”的 TreeView 控件 名为“cmdLoad”的 CommandButton 控件 将 Biblio.mdb 数据库绑定到 TreeView 控件 在工程中添加对数据访问对象(DAO 3.0)的引用。 为 Database 和 Node 对象创建模块级的变量。 在 Form Load 事件中,用 OpenDatabase 语句将 Database 对象变量设置为 Biblio 数据库。 用 Nodes 集合的 Add 方法创建顶层的节点对象。 在 CommandButton 的 Click 事件中,创建两个 Recordset 变量,并将它们设置为Publishers 和 Titles 表。

第6章 存储器层次结构

n局部性原理★ n存储器层次结构☆n高速缓存存储器☆

n到目前为止的计算机模型中,我们假设计算机的存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器位置。但它没有反映现代系统实际的工作方式。 n实际上,存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。 n如果你的程序需要的数据是存储在CPU寄存器中,那在指令的执行期间,在零个周期内就能访问到它们;如果存储在高速缓存中,需要1~30个周期;如存储在主存中,需要50~200个周期;如存储在磁盘上,需要大约几千万个周期 n作为一个程序员,需要理解存储器层次结构,它对应用程序的性能有着巨大的影响,这是因为计算机程序的一个称为局部性的基本属性引起的。

?不同矩阵乘法核心程序执行相同数量的算术操作,但有不同程度局部性,它们运行时间可以相差20倍 ?本章将介绍基本的存储技术、局部性、高速缓冲存储器等内容。

n局部性原理★ n存储器层次结构☆n高速缓存存储器☆

?RAM(随机访问存储器,Random-Access Memory )–静态RAM (SRAM) ?每个cell使用6个晶体管电路存储一个位 ?只要有电,就会无限期地保存它的值 ?相对来说,对电子噪声等干扰不敏感 ?比DRAM更快、更贵 –动态RAM (DRAM) ?每个cell使用1个电容和1个访问晶体管电路存储一个位 ?每隔10-100 ms必须刷新值 ?对干扰敏感 ?比SRAM慢,便宜 ü拍、太、吉、兆、千、毫、微、纳(毫微)、皮(微微)、飞(毫微微)

?传统DRAM芯片 –所有cell被组织为d个supercell,每个supercell包含了w个cell,一个d×w的DRAM总共存储了dw位信息。supercell被组织成r行c 列的矩阵,即rc=d。

存储器习题解答.

1. 用下列芯片构成存储系统,各需要多少个RAM芯片?需要多少位地址作为片外地址译码?设系统为20位地址线,采用全译码方式。 (1)512×4位RAM构成16KB的存储系统; (2)1024×1位RAM构成128KB的存储系统; (3)2K×4位RAM构成64KB的存储系统; (4)64K×1位RAM构成256KB的存储系统。 解:(1 需要16KB/512×4=64片,片外地址译码需20-log2512=11位地址线。 (2 需要128KB/1K×1=1024片,片外地址译码需20-log21024=10位地址线。 (3 需要64KB/2K×4=64片,片外地址译码需20-log2(1024×2=9位地址线。 (4 需要256KB/64K×1位=32片,片外地址译码需20-log2(1024×64=4位地址线。 2. 现有一种存储芯片容量为512×4位,若要用它组成4KB的存储容量,需多少这样的存储芯片?每块芯片需多少寻址线?而4KB存储系统最少需多少寻址线? 解: 4K×8bit /512×4bit= 16片,需要16片存储芯片; 29 = 512,每片芯片需9条寻址线; 212 = 4096,4KB存储系统最少需12条寻址线。 3. 一个具有8KB直接相联Cache的32位计算机系统,主存容量为32MB,假定该Cache 中块的大小为4个32位字。 (1)求该主存地址中区号、块号和块内地址的位数。 (2)求主存地址为ABCDEF16的单元在Cache中的位置。 解: (1 主存区数为32MB/8KB = 4096,212 = 4096,区号的位数为12; 区内块数为8KB/4×4B = 512,29 = 512,块号的位数为9; 块内单元数(字节编址)为4×32 / 8 = 16,24 = 16,块内地址的位数4。 (2)主存地址为ABCDEF16的单元其二进制地址为: 0 1010 1011 1100 1101 1110 1111 (主存字节地址为25位 区号为0 1010 1011 110 块号为0 1101 1110

c#treeview绑定四级菜单

Winform中常常会涉及这方面的应用,用treeview来绑定四级部门,下面是我在实际经验中总结出来的一段代码,以供参考,并有注释 private void binds() { DataSet ds = new DataSet(); SqlConnection con = new SqlConnection(Maticsoft.DBUtility.DbHelperSQL.connectionString); string sql = "select CompanyName from CRM_CompanyInformationFirst"; SqlDataAdapter adapter = new SqlDataAdapter(sql, con); adapter.Fill(ds, "companyname"); foreach (DataRow row in ds.Tables["companyname"].Rows)//一级菜单绑定总公司 { TreeNode tn = new TreeNode(); https://www.doczj.com/doc/2c16368543.html, = row["companyname"].ToString(); tn.Text = row["companyname"].ToString(); treeView1.Nodes.Add(tn); DataSet d = new DataSet(); string ss = "select CompanyName from CRM_CompanyInformationSec where job_no='" + https://www.doczj.com/doc/2c16368543.html, + "'"; SqlDataAdapter da = new SqlDataAdapter(ss, con); da.Fill(d, "CompanyName"); foreach (DataRow rows in d.Tables["CompanyName"].Rows)//二级菜单绑定分公司 { TreeNode tnn = new TreeNode(); https://www.doczj.com/doc/2c16368543.html, = rows["CompanyName"].ToString(); tnn.Text = rows["CompanyName"].ToString(); treeView1.Nodes[tn.Index].Nodes.Add(tnn); DataSet dd = new DataSet(); string sss = "select CompanyName from CRM_CompanyInformationThird where job_no1='" + https://www.doczj.com/doc/2c16368543.html, + "' and job_no2='" + https://www.doczj.com/doc/2c16368543.html, + "'"; SqlDataAdapter daa = new SqlDataAdapter(sss, con); daa.Fill(dd, "CompanyName"); foreach (DataRow rowss in dd.Tables["CompanyName"].Rows)//三级菜单绑定部门 { TreeNode tnnn = new TreeNode();

相关主题
文本预览
相关文档 最新文档