大量纪录的更新!(50分)

  • 主题发起人 主题发起人 aries
  • 开始时间 开始时间
A

aries

Unregistered / Unconfirmed
GUEST, unregistred user!
我的项目中有时会更据算法的改变对所有纪录的某几个字段进行重算与更新;
如果用while not table.eof do ...table.next这样一条条的算实在太慢了,10-30万条纪录要用半小时,且cpu满负荷运行,有时会停止响应;还请各位高手指点。
 
使用sql , Tquery
语句如下:
update 表名
set f1=value1,
set f2=value2,
where 条件;
 
用缓存更新不久行了
query。cachedupdate:=true;
 
table 最好用 query 控件。还有好多我回去看看书,
 
在循环中加application.processmessages吧,免得死机一样。
不过用循环效率不高。
query1.sql.add('select .. from yourtable where cond');
query1.open;
while not query1.eof do
begin
application.processmessages;
...
query1.next;
end;
不知这样写是否好一点?

 
同意 啊猛 的看法,使用 QUERY 会好办一些。
可以考虑使用 计算字段 既 ‘招之即来,挥之即去’
不知道对你是否适用
 
啊猛。:~)
 
重看了一编李维的书.是这莫讲的
意思是只是简单的使用 ttable. 很慢 5000 数据 200 多秒.tquery 更慢了.
可这样解决
database1.startranscation; 开始事务处理;
query1.prepare;准备 sql;
.
.
query.execsql;
query.unprepare;
database1.commite 确定交易完成;
这样 5000 数据只要 10 几秒就完成了;爽不爽.query 也比 table 更有效.
 
用线程后台更新
TQuey
 
“10-30万条纪录“ 还用文件型数据库,当然慢了,
什么方法也没用,胎里带.

换C/S数据库,这样的操作在数据库后台运行,可轻松搞定.
 
文件型数据库的确慢。如不是许多人同时用一个数据库。可用单层数据库。因为
c/s也慢。缓存更新没说完。 query。cachedupdate:=true;

。执行命令。
query。applyupdate;把缓存中的东西写入数据库中。
我倾向于用事务处理
 
同意阿蒙的看法。用事务处理对数据库来说很安全:要么全改了,要么全不改。
但我不知道怎么才能够在事务处理有异常的时候捕获异常消息呢?
 
try
uery1.prepare;准备 sql;
.
.
query.execsql;
query.unprepare;
database1.commit; 这写错了。
exception
database1.rollback;
end;
这样可避免异常。但不知要捕获甚莫异常。所以只是采取方法避免了
 
不对。如果有异常,SQL是不会改变数据的。你怎么还RollBack呢?
 
可能不只有 sql 
调用 rollback 是安全起见。

 
用TQuery控件.
 
结束吧,现在阿蒙很缺欠钱化
 

在事务中处理异常。

Var iCount:Integer;

Begin

{ Start the transaction }
DbGl.StartTransaction;

Try
{ process with Query }

{ Capture BDE error }
Try
{ Something }
Except
{ Check what type of exception was generated }
on E:EDBEngineError do
{ Iterate through the Errors array }
for iCount := 0 to E.ErrorCount-1 do
{ Add the error text to the list box }
ListBoxMsg.Items.Add(E.Errors[iCount].Message);
End;


{ Commit the changes }
DbGl.Commit;

Except

{ Rollback modifications }
DbGl.Rollback;

{ Reraise the exception }
Raise;

End;

End;
 
谢谢各位高手,我正在消化上面的各种方法!
可惜分不多了,要不然咱不会这么抠门的?缺钱的就多给点!
 
后退
顶部