关于access数据库丢失数据的现象(100分)

  • 主题发起人 主题发起人 elsss
  • 开始时间 开始时间
E

elsss

Unregistered / Unconfirmed
GUEST, unregistred user!
我做得数据库程序,用了一段时间,莫名其妙的丢失数据,刚录入的数据,关闭程序,再打开就可能消失的无影无踪。经过网上搜索,都说数据库不会丢失数据,应该是程序写的有问题。经过检查。发现最可能是出现在备份上。我写了一段代码,bakdbaccess;-----用COPYFILES('')备份数据库, 然后每次退出这样执行
if application.MessageBox(pchar('确实要退出『'' 』么吗? '),'退出系统',4)=6 then
begin
bakdbaccess;////备份
application.Terminate;
end;
我觉得可能问题出现在这里。但是不明白原因。数据很少的时候发现不了
 
拷贝文件时要确保数据库已经关闭.
 
"if application.MessageBox(pchar('确实要退出『'' 』么吗? '),'退出系统',4)=6 then"
=6是 什么意思啊,是退出就执行吗?最好把你的bakdbaccess粘一下。
 
问题不在这里,要看你bakdbaccess这个函数怎么执行的,你最好吧这个函数改为
function bakdbaccess: boolean;

这样在退出时就可以检查是否备份成功。还有,程序退出时不需要执行application.Terminate;
你应该在FormCloseQuery(Sender: TObject;
var CanClose: Boolean);

function Tform_main.ShowMsgs(S: string): Boolean;
begin
Result := Application.MessageBox(pchar(S), '提示', MB_YESNO or MB_ICONWARNING) <> IDNO;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := false;
if ShowMsgs('您确实要退出吗?') then
begin
if bakdbaccess then
CanClose := true;
end;
end;

你在用我这个办法试一下
 
同意nanshan的说法,怎么都不判断拷贝是否完成呢??
 
application.Terminate;是强制中断主程序线程的
所以相当于你备份操作没完成就杀掉主程序了,自然备份程序也没完成。

用 Form.close 就可以了。 或者像nanshan说的
 
多谢各位,还是我的编程基础不好,好多基础知识都不懂。
to: xingxin00
"if application.MessageBox(pchar('确实要退出『'' 』么吗? '),'退出系统',4)=6 then" //这句话的意思是弹出的消息框,选择‘是’这个按钮,就执行begin...end之间的内容,选择‘否’不执行

但是各位,我还有一个疑问,如果application.Terminate导致没备份完就杀掉主程序,应该只是备份不完整,为什么正在用着的数据库也会丢失数据??
感谢大家教会我一个方法,应该尽量多用boolean,也就是函数要写成带返回值的形式,确保函数执行完毕

附:我原来的函数是这样写的
procedure TMain_frm.bakdbaccess;
begin
sdir:=ExtractFilePath(Application.ExeName)+'';
copyfile(pchar(sdir+'/data/data.mdb'),pchar(sdir+'/bak/'+SYSdate+'.HLALA'),true);
end;
是否应当这样改??
function TMain_frm.bakdbaccess:boolean;
begin
result:=false;
sdir:=ExtractFilePath(Application.ExeName)+'';
copyfile(pchar(sdir+'/data/data.mdb'),pchar(sdir+'/bak/'+SYSdate+'.HLALA'),true);
result:=true;
end;
请指教。
 
copyfile(pchar('C:/XP.asz'),pchar('C:/XP1.asz'),false)
function TMain_frm.bakdbaccess:boolean;
var
sdir:string;
begin
sdir:=ExtractFilePath(Application.ExeName)+'';
result:=copyfile(pchar(sdir+'/data/data.mdb'),pchar(sdir+'/bak/'+SYSdate+'.HLALA'),false{false时,如复制到的文件存在时会覆盖,true时,如复制到的文件存在时会返回失败});
end;
 
谢谢各位,尤其是nanshan的热心帮助
 
后退
顶部