Delphi中代码怎样实现access数据库的备份及恢复(30分)

  • 主题发起人 主题发起人 zwp888
  • 开始时间 开始时间
Z

zwp888

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中代码怎样实现access数据库的备份及恢复
 
我分分不多了,不好意思
回答了等下加分
 
把 access数据库文件 复制 粘贴一下
delphi 里的函数: copyfile
 
//备份过程
procedure TfrmMainForm.BackupDatabase(gOldMdb, gNewMdb: string);
begin
if Length(gOldMDB)>0 then
begin
if Length(gNewMdb)>0 then
begin
if CopyFile(pchar(gOldMdb),pchar(gNewMdb),False) then
Messagebox(handle, '备份数据库文件成功!', '提示', MB_OK+MB_ICONINFORMATION)
else
Messagebox(handle, '备份数据库文件失败!', '提示', MB_OK+MB_ICONSTOP);
end
else Messagebox(handle, '请输入需保存为的数据文件名!', '提示', MB_OK+MB_ICONINFORMATION);
end
else
Messagebox(handle, '请输入需备份的数据文件!', '提示', MB_OK+MB_ICONINFORMATION);
end;


//恢复过程
procedure TfrmMainForm.ComeBackDatabase(gOldMdb, gNewMdb: string);
begin
if Length(gOldMDB)>0 then
begin
if Length(gNewMdb)>0 then
begin
if CopyFile(pchar(gOldMdb),pchar(gNewMdb),False) then
Messagebox(handle, '恢复数据库文件成功,请重启程序!', '提示', MB_OK+MB_ICONINFORMATION)
else
Messagebox(handle, '由于数据库正在被使用,恢复数据库文件失败!', '提示', MB_OK+MB_ICONSTOP);
end
else Messagebox(handle, '请输入需保存为的数据文件名!', '提示', MB_OK+MB_ICONINFORMATION);
end
else
Messagebox(handle, '请输入需备份的数据文件!', '提示', MB_OK+MB_ICONINFORMATION);
end;
 
Access 本身提供了备份单表的 VBA(跟拷贝文件是两回事),我这有个过程,感兴趣就看看吧:
//导出、备份 Access 表的过程,一个过程两种功能:
uses ComObj;

type
TTransferType = (Import = 0, Export = 2);

//db: 数据库名称(完整路径);tbl: 表名;bak: 备份文件名称(完整路径);
//typ: 选择备份还是恢复(默认是备份);
//pwd: 数据库密码(可选,没有密码可以不管)
procedure Comebackup(const db, tbl, bak: WideString;
const typ: TTransferType = Export; const pwd: WideString = '');
var
ac: OleVariant;
begin
ac := CreateOleObject('Access.Application');
try
ac.OpenCurrentDatabase(db, False, pwd);
ac.DoCmd.TransferText(typ, Null, tbl, bak, True);
finally
if not VarIsEmpty(ac) then
begin
ac.Quit;
ac := Unassigned;
end;
end;
end;
 
其实,直接备份整个数据库文件更稳妥一些吧,能够把备份的资料压缩或者加密一下。
用流读入,进行一下变换(比如直接用zLib中的压缩流压缩数据库),这样备份文件又小又安全。
不过先用楼上vvyang的过程导出文件,再加密压缩,能避免因整个数据库过大带来的压缩困难。
 
To:vvyang
我程序编译到这条语句:
ac.OpenCurrentDatabase(db, False, pwd);
提示错误"无效的参数数目",应怎么修改.

另外,备份跟恢复是否只要给其中typ赋不同值,其他参数不变;
当恢复数据库时,原数据库是否被覆盖

谢谢了!!!!!
 
To zwp888:
1、没人出现过这种错误;
2、是的;
3、不会覆盖,你最好动手试一下。
 
To:vvyang
我的程序中是这样的,import按钮还原,export按钮备份,程序目录下我建了一个db1.mdb,
此目录下有个BAK文件夹,备份的dat文件放在BAK下。程序运行后,按备份按钮,就提示"无效的参数数目",帮我看看什么错误,谢谢帮忙!!!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, idglobal, Comobj;
type
TTransferType=( Import=0,bakup=2);
type
TForm1 = class(TForm)
Export: TButton;
Import: TButton;
procedure ExportClick(Sender: TObject);
procedure ImportClick(Sender: TObject);
private
Procedure Comebackup(Const db, tbl, bak: WideString; const typ: TTransferType=bakup; const pwd:WideString='');
{ Private declarations }
public


{ Public declarations }
end;

var
Form1: TForm1;



implementation

{$R *.dfm}

Procedure TForm1.Comebackup(Const db, tbl, bak: WideString; const typ: TTransferType=bakup; const pwd:WideString='');
var
ac: OleVariant;
begin
ac:=CreateOleObject('Access.Application');
try
ac.OpenCurrentDatabase(db, False, pwd);
ac.DoCmd.TransferText(typ, Null, tbl, bak, True);
finally
if not VarIsEmpty(ac) then
begin
ac.quit;
ac.unassigned;
end;
end;
end;

procedure TForm1.ExportClick(Sender: TObject);
var
db,bak: WideString;
begin

db:=ExtractFilePath(ParamStr(0))+'db1.mdb';
bak:=ExtractFilePath(ParamStr(0))+'bak/'+FormatDateTime('yyyymmdd',now)+'.dat';
ComeBackup(db, 'finish', bak, TTransferType(1),'');
end;



procedure TForm1.ImportClick(Sender: TObject);
var
db,bak: WideString;
begin
db:=ExtractFilePath(ParamStr(0))+'db1.mdb';
bak:=ExtractFilePath(ParamStr(0))+'bak/'+FormatDateTime('yyyymmdd',now)+'.dat';
ComeBackup(db, 'finish', bak, TTransferType(0),'');
end;

end.
 
To zwp888:
你都写了些什么啊,TTransferType(1)、TTransferType(0),这是虾米玩意??
procedure TForm1.ExportClick(Sender: TObject);
...
begin
...
ComeBackup(db, 'finish', bak, 2);
end;

procedure TForm1.ExportClick(Sender: TObject);
...
begin
...
ComeBackup(db, 'finish', bak, 0);
end;

procedure TForm1.ImportClick(Sender: TObject);
...
begin
...
ComeBackup(db, 'finish', bak, 0);
end;

另外希望您的两个按钮不要起“Import、Export”之类的名字,不然会跟 TTransferType 类型混淆。
 
To: vvyang

谢谢你的建议
另外,ComeBackup(db, 'finish', bak, 2);传递2提示类型不匹配,
用ComeBackup(db, 'finish', bak, export);可以
但还是有同样的错误提示,然后光标就停在:ac.OpenCurrentDatabase(db, False, pwd);
在你的电脑上调试看看,谢谢!
麻烦了!
 
//备份
procedure TfmMain.DoBackupExecute(Sender: TObject);
begin
if SaveDialog.Execute then
begin
if ZipFile(Global.ExePath + 'dbWuye.mdb', SaveDialog.FileName) then
MessageDg('备份数据库成功', MB_ICONINFORMATION)
else
MessageDg('备份数据库失败', MB_ICONWARNING);
end;
end;
//还原
procedure TfmMain.DoRestoreExecute(Sender: TObject);
begin
if MDIChildCount > 0 then
raise Exception.Create('请先关闭所有窗口');
if OpenDialog.Execute then
begin
try
dmMain.ConnectionMain.Connected := False;
DeleteFile(Global.ExePath + 'dbWuye.bak');
CopyFile(Pchar(Global.ExePath + 'dbWuye.mdb'), Pchar(Global.ExePath + 'dbWuye.bak'), False);
DeleteFile(Global.ExePath + 'dbWuye.mdb');
if UnZipFile(OpenDialog.FileName, Global.ExePath + 'dbWuye.mdb') then
MessageDg('还原数据库成功', MB_ICONINFORMATION)
else
MessageDg('还原数据库失败', MB_ICONWARNING);
dmMain.ConnectionMain.Connected := True;
dmMain.qryLogin.Active := True;
except
if FileExists(Global.ExePath + 'dbWuye.bak')
and not FileExists(Global.ExePath + 'dbWuye.mdb') then
CopyFile(Pchar(Global.ExePath + 'dbWuye.bak'), Pchar(Global.ExePath + 'dbWuye.mdb'), False);
end;
end;
end;

function ZipFile(Source, Target: String): Boolean;
var
Buf : array[0..1023] of Byte;
ZStream : TCompressionStream;
SourceStream,
TargetStream : TFileStream;
Size : Longint;
ReadCout : Integer;
begin
Result := False;
SourceStream := TFileStream.Create(Source, fmOpenRead or fmShareDenyNone);
TargetStream := TFileStream.Create(Target, fmCreate);
ZStream := TCompressionStream.Create(clDefault, TargetStream);
try
try
Size := SourceStream.Size;
ZStream.Write(Size, 4);
while SourceStream.Position < SourceStream.Size do
begin
ReadCout := SourceStream.Read(Buf, 1024);
ZStream.Write(Buf, ReadCout);
end;
Result := True;
except
;
end;
finally
SourceStream.Free;
ZStream.Free;
TargetStream.Free;
end;
end;

function UnZipFile(Source, Target: String): Boolean;
var
Buf : array[0..1023] of Byte;
ZStream : TDecompressionStream;
SourceStream,
TargetStream : TFileStream;
Size : Longint;
ReadCout,
Total : Integer;
begin
Result := False;
SourceStream := TFileStream.Create(Source, fmOpenRead);
TargetStream := TFileStream.Create(Target, fmCreate);
ZStream := TDecompressionStream.Create(SourceStream);
try
try
ZStream.Read(Size, 4);
Total := 0;
while Total < Size do
begin
if Size - Total >= 1024 then
ReadCout := ZStream.Read(Buf, 1024)
else
ReadCout := ZStream.Read(Buf, Size - Total);
Total := Total + ReadCout;
TargetStream.Write(Buf, ReadCout);
end;
Result := True;
except
;
end;
finally
ZStream.Free;
SourceStream.Free;
TargetStream.Free;
end;
end;
 
To: weichao9999

请问程序中要引用哪些头文件,谢谢!!
 
TCompressionStream,TDecompressionStream, TFileStream引用哪些头文件
 
大虾帮忙啊,TCompressionStream,TDecompressionStream, TFileStream要引用哪些头文件,急
 
TCompressionStream,TDecompressionStream uses ZLib , TFileStream uses Classes
 
谢谢了,顺便问一下,哪里有没有这种资料下载或书籍:比如要找某个类从什么头文件引用。
或者有什么好的途径查找头文件,这个问题一直觉得很头疼
 
按F1就有了
 
很多类在delphi帮助里根本找不到,就比如上面我提到的几个类在帮助里就找不到,
请大虾们向小弟指点一下
 
TFileStream enables applications to read from and write to a file on disk.

Unit

Classes

Description

Use TFileStream to access the information in disk files. TFileStream will open a named file and provide methods to read from or write to it. If an application already has a handle to the file, opened in the appropriate mode, use THandleStream instead.

有的是第三方的类,在Delphi的help里当然没记录了
 
后退
顶部