刚才输入的数据突然丢失了,如何避免?(100分)

  • 主题发起人 主题发起人 李长柱
  • 开始时间 开始时间

李长柱

Unregistered / Unconfirmed
GUEST, unregistred user!
当您开机后,开始输入数据,若正常退出系统,则数据会被安全地保存。
若在输入数据的过程中,突然发生断电或出现致命错误时,
其新输入的数据将被忽略,刚才所输入的数据都丢失了,
能不能有办法避免这一问题,在程序的运行过程中如何实现?
我曾经使用过TDatabase构件,使用Close,和Open方法,
但调用了TDatabase.Close方法后,所有的数据库都关闭了,
有每有更好的方法?
 
呵呵,
对于断电:
UPS!
至少可以保证在你保存数据之后才断电;

对于致命错误:
恐怕只有一方面保证自己的程序的健壮性,一方面不允许其它程序同时运行。
当然前提之一就是:我们假设window是没有问题的;-)
 
做个临时表,每隔几秒就把数据存起来,
 
嘿嘿,又来了.
tdataset.flushbuffer;将数据写入硬盘! 在一些系统中一定要注意使用,否则隐患大大地有!
 
bde.dbiSaveChanges(....)
 
menxin:
对于你说的方法,我查阅了Delphi的帮助,找到了TDBDataSet.flushbuffers
方法,但它只能对单表进行处理,后来有近一步查找TBDEDataSet.flushbuffers
方法,但不知道如何使用,至于在TDataSet中没有找到flushbuffers方法
我使用的是D5,我希望找到能对多表进行刷新的方法,而不是单表。

Nose:你所说的方法可能是最好的,但我没有找到,能不能具体些?多谢!
 
uses bde;
dbisavechanges(table1.handle);
 
那么你是使用什么构件呢?
 
memxin:
我是使用的是TTable构件,使用TTable(Paradox数据库)的Flushbuffers方法
只能对单表进行处理,如果我忘记了对某一个表进行的刷新,那么就会造成数据库
的不一致性,这是绝对不允许的,必需一次性将所有的数据库都保存起来,
实际上,Delphi中的这种数据丢失是一种保持数据库一致性的办法,
我编写的程序中都通过TDatabase进行存取,调用TDatabase.Close方法后,
所有的数据都被自动保存了,但调用TDatabase.Close方法后,所有的TTable表
就都被关闭了,若继续使用,所有的表都必需重新打开,那么,在数据输入过程中
就不能使用该方法,我希望找到更好的方法。
 
hubdog and Nose:
这种方法,我已经试过了,其效果和TDBDataSet.flushbuffers的效果是一样的,
只能对单表进行处理,而不能一次将所有的数据库刷新。
我希望能找到类似于TDatabase.Close的方法,最好不关闭数据库。
 
我想你的问题应该通过事务及UPS来解决.
 
你应该使每个table的afterpost及相关事件句柄中加入ttable(dataset).flushbuffer.
如果你的table都在一个datamodule中,这一过程并不困难.你可以在设计时一次性给
所有的table的相关事件赋值(全部选中所有table,赋以同一事件),或者用以下代码:

datamodel.oncreateevent:

var i:Integer;
begin
...
for i:=0 to Self.ComponentCount-1 do
if Self.Components is TTable then
TTable(Self.Components).AfterPost:=MyProcessPost;
...
end;

procedure Tform1.MyProcessPost(DataSet: TDataSet);//需在public部分声明
begin
TTable(DataSet).FlushBuffers;
end;

>>如果我忘记了对某一个表进行的刷新,那么就会造成数据库的不一致性,这是绝对不允许的

我想你应该对你的错误负责吧.何况这错误并非是不可避免的. :-)

 
menxin的答案最适合我了。
 
多人接受答案了。
 

Similar threads

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