ACCESS数据库备份与恢复的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 listhano
  • 开始时间 开始时间
L

listhano

Unregistered / Unconfirmed
GUEST, unregistred user!
我是想用TSaveDialog来做。
1、先删除数据库文件OldDat.mdb;用DeleteFile函数
2、然后,再用CopyFile拷贝数据库文件;也就是在SaveDialog.Files.Text(暂且叫NewDAT.mdb)中调用的文件;
3、现在问题来了!原数据库文件(OldDat.mdb)已经锁定了,无法删除。也就无法拷贝SaveDialog.Files.Text(NewDAT.mdb)中的文件到指定的文件夹了(也就是ExtractFilePath(Paramstr(0))指定的路径)!
4、这个问题怎样解决?

看看是这样的。
------------
begin
if SaveDialog.Execute then
begin
DeleteFile(trim(ExtractFilePath(Paramstr(0))+'OldDat.mdb'));
CopyFile(PChar(Trim(SaveDialog.Files.Text)),PChar(trim(ExtractFilePath(Paramstr(0)))+'OldDat.mdb'),true);
end;
end;
------------
如果上述的方案无法完成,也只能像下面的方法做了!
(那可就非常麻烦了!呜呜呜呜...):
1、把OldDAT.mdb中的所有表打开,同时把NewDat.mdb中的所有数据表也打开;
2、然后,把OldDAT.mdb中的所有表的数据逐字段、逐条记录放到NewDat.mdb数据库中的各个对应的表中。
 
还原?save?[:(!]
 
没看懂你的做法。。
1.备份
直接用CopyFile将ACCESS库拷贝一份就是了
2.还原
先CLOSE掉ACCESS的连接,再用CopyFile将备份的ACCESS拷贝到软件中,最后OPEN你的连接就行了
 
你Delete数据库文件前需要断开所有的数据库连接,如果没有断开连接,那么该文件仍然被占用,连删除也是不会成功的.
Copy回来文件后再重新建立所有连接
 
to bjaman
就像你说的这样,其他的窗体一直占用数据库连接。我在OnShow中用了连接。
我想把数据(因为备份数据,在有连接的时候也可以做到),拷贝回来:因为在OnShow事件中占用了连接。因此,无法删除数据库。
怎么做才能删除数据。(我不想改变OnShow中的连接)。能行吗?
 
删除文件是个独占操作,不可以既在使用该文件,还要删除该文件。
 
to bjaman
你说得很对!删除是独占操作的。我想了另外一个办法:就是把往回拷贝文件单独做一个可执行文件,然后做“安装程序”的时候,做在“程序组里”;这样如果用户需要导入备份的数据的时候,可以单独进行。这个办法,也行的。
过后。我把分数都加给你吧!
 
欢迎加入新起点群,群号(37792189),本群为DELPHI与SQL SERVER 为主,
当然群里也有其它方面的专业人员
如(asp.net(C#),java等),现在程序员都不只学一门语言的哈,
本群是以一门程序语言为主打,多种语言为基点学习的群.

本群主要功能:
1:积极的讨论各种技术;
2:让你能结交更多的朋友,学习到更多先进的技术;
3:在你无聊的时候,群里更可以什么都聊聊(但得注意素质);

为了提高群的人上线要求;如果你有Q币的话,希望能够为群做一些贡献,并有机会成为本群的管理员.
 
删除跟复制数据库文件必须先断掉数据库的连接才性
因为当数据库打开的时候 是独占的
再打开就只能以只读的权限来打开数据库了:)
 
可以采用二进文件拷贝的方式进行备份,删除时可利用SQL的delete语句进行,可对数据库中的某个表进行单独的删除.
 
procedure Tbak_frm.backupfile(source, destination: string);
var
FromF,ToF: file of byte;
buffer:array[0..2048] of char;
NumRead:integer;
FileLen:Longint;
begin
AssignFile(FromF,source);
reset(FromF);
AssignFile(toF,destination);
rewrite(ToF);
FileLen := FileSize(FromF);
with progressbar1 do
begin
position := 0;
min := 0;
max := FileLen;
while FileLen>0 do
begin
BlockRead(FromF,buffer[0],sizeof(buffer),NumRead);
FileLen := FileLen-NumRead;
Position := position+NumRead;
BlockWrite(ToF,buffer[0],NumRead);
end;
closeFile(FromF);
closeFile(ToF);
Messagebox(handle,'数据库备份成功!','提示',mb_ok);
end;
end;
procedure Tbak_frm.SpeedButton1Click(Sender: TObject);
begin
if saveDialog1.Execute then
Edit1.Text :=savedialog1.FileName;

end;
 
to yangxiufengcom
你用文件流的办法也很好,就是有点儿麻烦!
看看我是这样解决的:
========================================
procedure TfrmResum.mdbOpenClose(mdbSource,mdbAim:string);
var
qrySource,qryAim:TADOQuery;
const
strA='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
strB=';Persist Security Info=false';
begin
qrySource:=TADOQuery.Create(nil);
qryAim:=TADOQuery.Create(nil);
try
qrySource.ConnectionString:=strA+ExtractFilePath(paramstr(0))+mdbSource+strB;
qrySource.Close;
qryAim.ConnectionString:=strA+ExtractFilePath(paramstr(0))+mdbAim+strB;
qryAim.Close;
finally
qrySource.Free;
qryAim.Free;
end;
end;

procedure TfrmResum.ResumMdbAccess(SourceName,AimName:string);
var
iG:integer;
begin
self.Caption:='正在导入数据...请稍候!';
for iG:=gg.MinValue to gg.MaxValue do
gg.Progress:=iG;
mdbOpenClose(SourceName,AimName);//连接数据,然后再断开;好像有点儿多余!!!
deleteFile(pchar(ExtractFilePath(paramstr(0))+AimName));
CopyFile(Pchar(SourceName),Pchar(ExtractFilePath(paramstr(0))+AimName),true);
self.Caption:='数据导入完成...请关闭窗体返回!';
end;

procedure TfrmResum.btnOKClick(Sender: TObject);
const
aimStr ='CmaDat.mdb';
begin
if svDlg.Execute then
begin
if MessageBox(Handle,'警告!如果导入的文件格式不对,系统将无法使用,继续吗?','确认',mb_YESNO OR mb_IConWarning)=6 then
begin
ResumMdbAccess(trim(svDlg.Files.Text),aimStr);
MessageBox(Handle,'数据文件导入成功!','确认',mb_OK OR mb_IConWarning);
end;
end;
end;
 
ACCESS数据库可以直接用拷贝整个数据文件的形式进行数据备份,当数据加载出现问题时将整个数据库文件进行覆盖恢复即可。只要做一个计划任务进行数据库的拷贝计划就可以了(比如:一周从周一到周五每天零点进行数据库拷贝操作并命名为DBBack.bk0~DBBack.bk6)。这可能是最简单的ACCESS数据库数据备份与恢复方式了。
 
真搞笑^_^。
删除后你还copy个鬼啊;
直接覆盖copy就行了,不过在这之前得断开对数据库文件的引用。
如果access文件比较大,可以考虑用dos命令做,然后shellExcute或winExec
执行一下即可,速度很快,犹如滔滔江水 ~~~~~~~
 
deleteFile(pchar(ExtractFilePath(paramstr(0))+AimName));
这一行代码是多余的了?
我试试!
 
这个问题这问
先关掉数据库连接,那个撒OldDat.mdb文件就不见了,再拷,再打开数据库连接
 
哦,忘了,如果你在备份的时候不能让其登陆用户退出,那就让其它用户先强行退出再关
再拷再开
 
deleteFile(pchar(ExtractFilePath(paramstr(0))+AimName));
这个删除数据库文件必须有;否则就不能更新数据库文件!!!
 
多人接受答案了。
 

Similar threads

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