急需怎样解决遍历表的速度。(200分)

  • 主题发起人 主题发起人 xiaohong
  • 开始时间 开始时间
X

xiaohong

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用DELPHI5 编写数据库程序时,遇到了这样的问题:

在遍历 TABLE1 时使用了以下语句:


var
i,j,aaa:integer;
begin
i:=0;
j:=1;
Table1.DisableControls ;
Gauge1.MaxValue :=Table1.RecordCount ;

Table1.First ;
while not Table1.Eof do
begin
// 此处为一自定义函数 JiSuanDate,
// 判断处理该记录的 '日期' 等数据,返回一INTEGER 型值.
aaa:=JiSuanDate;
Table1.Edit;
Table1['xxxxx']:=aaa;
Table1.Post ;
i:=i+aaa;
Gauge1.Progress :=j;
inc(j);
Table1.Next ;
end;
Gauge1.Progress:=0;
Table1.EnableControls ;
end;
当记录比较少时,大约在100条左右,进度条速度快,当记录增大到4000条时,
进度条速度慢得难以忍受。
后来在 Table1.OnCalcFields 事件中调用此函数并增一计算字段,结果很快,
但不能将计算字段结果写回到Table1['xxxxx']中.

急请各位仙人指点、解决这两问题。


 
table1.edit每循环一次都作一下吗?
不知道这样费不费时,放在while 前行吗?
 
开始循环之前用edit
循环结束用post
还要仔细检查一下你自定义函数的算法,要尽可能简洁。
还有那个j变量是不是可以用recno属性代替!
还有在改变进度条的值时是不是要将进度条刷新一下,因为进行循环时是不能释放控制权的。
 
我同意上面两位前辈的方法。
但我会SQL来解决:
如果你的JiSuanDate比较简单
Updata YourTable
Set xxxxx=JiSuanDate
 
当你的记录经常性的大于5000条的话,继续使用桌面数据库
好象就不是一种明智的选择了,
建议使用SQL数据库,处理你的问题只需要一条SQL语句,
耗时应在1秒以内
 
在之前用cdsDetail.DisableControls;脱开数据显示的关联,

之后再用cdsDetail.EnableControls;加载数据显示的关联,

就可提高不少。
 
to xiaohong:
i read your letter,
"table1.post" 也不要,try do it
 
各位仙人:能详细的指点一下吗?
我快要急疯了!!!

 
用ClientDataSet试一试。
 
置CachedUpdates为True, 等循环完成后一次ApplyUpdates
 
如果后台是大型数据库(例如 SQL Server, Sybase, DB2, Oracle等)可以使用事务
方式,建议使用TQuery,不要用TTable,这样便于掌握全局,程序更加灵活,如果写得好
的话,速度都要快些(换句话说,写得不好还可能更慢)

用TQuery的话,可以用 UPDATE xx SET aaa=bbb WHERE ccc=ddd 的SQL语句来一次修改
多条记录。在执行SQL语句的时候可以先开启事务,这样可以加快数据存取。我的成绩处理程序就是
这样解决遍历的,如果在PIII的电脑上处理的话,每分钟可以处理上十万条记录(当然,这需要大型
数据库支持)
 
>>Another_eYes: 能详细些吗?
>>Cookey :我用的是 Paradox(7) 库.
Update xx Set aaa=bbb where ccc=ddd 是不可以的,因为更新的
记录是唯一的,而且是必须的. 也就是说, 编历一次表则所有的记
录都将更新,且更新的内容是不一样的。
 
还不够详细?
TTable有个属性叫CachedUpdates, 在设计时把它的值置为True;
然后执行您的遍历程序
在Table1.EnableControls前执行Table1.ApplyUpdates
 
怎么不可以,就看你怎么给出 where子句后面的条件了。
 
>>Another_eYes: 设置为 True 后反而更慢了 ,Why???
>>Cookey :是无条件的。
>>各位仙人:
可惜分太少否则再加上500分给你们。
有最优方法吗?
急死了(!@#$%^&*&*)

 
谢谢各位大仙.
 
后退
顶部