(cAKK、吴剑明,谢谢版主帮我看看)我用delpohi+win98开发程序。当程序非法操作或者系统突然掉电的时候,我再进入系统,程序中那些还没有来得急保存的数

我的程序象楼上的这样,防止死机的。
 
Table1.CommitUpdates;
因为使用 *.DB数据库时,POST 只是把数据保存到 缓存中,这样可以提高速度;
并没有保存到数据库文件中,也就是没有保存到硬盘文件中,所以会出现这种情况,
可以用上面的语句来把缓存中的数据保存到硬盘中。给一个例子给你:
procedure TForm1.ApplyButtonClick(Sender: TObject);

begin
with CustomerQuery do
begin
Database1.StartTransaction;
try
ApplyUpdates; {try to write the updates to the database};
Database1.Commit; {on success, commit the changes};
except
Database1.Rollback; {on failure, undo the changes};
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates; {on success, clear the cache}
end;

end;
 
买一个ups
 
昨天晚上初步实验了一下,Access2000没有发现问题。[:(]
 
table.post;
table.Active:=False;
Table.Active:=True;
可以保证你不丢数据。或则在AfterPos中用FlushBuffers试试
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
Table1.FlushBuffers;
end;

 
用access不会出现这样的情况,我专门为了这个问题故意在程序运行中间拔了电源,结果没有
任何损失,该改的也都改了!!
dbf 的好像不行,以前我用vfp的时候,出现这个情况,就把数据丢了,很惨的!!
paradox没用过,不知道!!
 
一般的说,只有当Table被关闭时修改的数据才被数据库引擎存进硬盘,系统掉电或者崩
溃都会导致数据丢失!为了避免数据丢失,可调用BDE函数(DbiUseIdleTime,DbiSaveChan
ges)强制存盘。

1.DbiSaveChanges(hDBICur):
==========================

DbiSaveChanges 保存所有的数据更新,可以随时调用。例如你可以在一个纪录更新后立
即存盘:

procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
DbiSaveChanges(Table1.handle);
end;


注:该方法并不适用于SQL数据表。


2.DbiUseIdleTime:
==========================

DbiUseIdleTime 可以在WINDOWS消息队列为空时调用,使BDE能够保存缓冲区中的数据。

换句话说,他完成DbiSaveChanges的所有功能,而且是保存所有更新过的表格。

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.onIdle := UseIdle;
end;

procedure Tform1.UseIdle(Sender: TObject; var Done: Boolean);
begin
DbiUseIdleTime;
end;

 
有一个很好用的Safetable控件,绝对解决TTable使用Paradox数据库丢数据的问题,
它在每次post后都将数据写到真正的数据表中,简单易用,我一直用的它,带原码,
深度历险上有下载
 
就是FLUSHBUFFERS,没别的
 
就是在AFTERPOST中加入TABLE.FLUSHBUFFERS, 我试过肯定行
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部