旧问题,如何做一棵极速的与数据库相联! ( 积分: 200 )

  • 主题发起人 主题发起人 LJH1978
  • 开始时间 开始时间
不能定位到子节点,只能定位到离它最近的父节点
HRP中那个就能直接定位到子节点,另外我用DBTREE,在关联中的DATASET中定位到记录中,TREE中的值也能定义到子节点
谢谢:
 
我试了还是4秒钟左右啊.难道我的版本比较新反到慢了
 
不好意思,可能刚才我没明白你问的“定位”意思。
你这所谓定位和层层展开其实质是一样,找到该节点的最近的已显示出来的父节点,然后把
它层层展开,直到该节点也显示出来就行了。
其实层层展开只是影响速度的一个很小因素,真正的问题是频繁的访问数据库所带来的速度慢的问题;你先把该技术框架构思好,其他的小的细节问题不用再问了,做的时候你自然就会明白该怎么去搞了

吃饭了,过回还要开会 ..............
 
to wr960204
我的意思是在 机构管理>信息录入>"单位所在地"
它的树的记录有3000多条
你进入后会感觉不到延时!

TO lisongmagic,谢谢!
 
分层加载啊
----------------------------------
一次加一层, 处理 + 很啰嗦.
一次加载两层, 就可以解决 + 的问题了.
----------------------------------
当 展开 爷爷节点时, 对父亲节点遍历, 加载所有父亲结点的孩子.
 
一次加载两层, 就可以解决 + 的问题了.
哦,第二层的一些节点可能有子结点,有些可能没有
 
没有子结点不管他就是了

在加载时, 利用 结点的data 来记录那些结点已经加载过 儿子了, 那些已加载过孙子了. 如果没用儿子, 将个结点 的 儿子标记, 孙子标记都标识一下即可

data 最好绑一个对象, 因为要记录加载标记,还有更多其他数据.
 
哎呀,方向渐渐都要偏了,瓶颈是数据库的I/O,想办法尽可能地减少访问数据库就解决主要问题了
 
hrp是用D5+TREE写的,他的速度就不慢
 
to lisongmagic
select sum(id) from table where len(id)=3
union
select sum(id) from table where len(id)=6
union
select sum(id) from table where len(id)=9
如果这个树有10级,代码不很长? 另外子结点的移动,会不会也麻烦?
另外我是一次性读出数据库,然后根据条件过滤
 
我只是给你个参考,你要把握本质:那就是如何设计才能最少访问数据库,只要达到这个目的,具体方法你可以根据实际情况灵活选择。给段代码你参考下:
(这是别人写的代码,有点不足,但是程序的核心算法值得学习)
1、现在很多人都使用“父—子结构+递归算法”来显示树型的层次结构,但是不得不说这是一种非常拙劣的方式,下面给大家一种简单方便的数据结构和算法,快速显示树型的层次结构:
2、数据库结构
例如表“国家”可以是这样:
编号 名称
----------
01 中国
0101 吉林省
010101 长春市
010102 吉林市
0102 江苏省
010201 南京市
010202 常州市
02 美国
0201 密歇根州
020101 底特律市
0202 华盛顿州
020201 温哥华市
020202 西雅图市
03 澳大利亚
3、在 TreeView 中显示结构
procedure CreateTree;
const
ID_DEPT = 2;
var
nLevel: Integer;
pNodes: array[0..1023] of TTreeNode;
lpID, lpName: string;
begin
ADODataSet1.Close;
ADODataSet1.CommandText := 'SELECT * FROM [国家] ORDER BY [编号]';
ADODataSet1.Open;
pNodes[0] := nil;
TreeView1.Items.Clear;
with ADODataSet1.Recordset do
while not Eof do
begin
lpID := Fields['编号'].Value;
lpName := Fields['名称'].Value;
nLevel := Length(lpID) div ID_DEPT;
pNodes[nLevel] := TreeView1.Items.AddChild(pNodes[nLevel - 1], lpName);
MoveNext;
end;
end;
 
to lisongmagic,这个代码我在DELPHIBOX上看到过,缺点暂不说它
我曾经试用,用这种方法生成地区树,时间也要>2秒,而我用DXDBTREELIST直接关联,用时在我这台破机器上要1425ms,我家中那台机器上在0.8s左右

但HRP用的是普通TREE控件,而且数据结构是ID ,PID NAME ....
它的那个树在载入地区时基本感觉不到延,关于这个问题,我重新开了个贴子,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3689129
请wr960204,lisongmagic等大侠有空时看看,谢谢
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
930
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
后退
顶部