望高手帮忙看一下代码unit TdataBackUnit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls;type
TDataBack = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Label3: TLabel;
Label4: TLabel;
Bevel_button: TBevel;
PanelBkGnd: TPanel;
Label5: TLabel;
Label6: TLabel;
Panel_button: TPanel;
Bevel1: TBevel;
Edit_path: TEdit;
BrowseBtn: TButton;
BackData: TBitBtn;
RecoverData: TBitBtn;
a1: TAnimate;
CancelBtn: TBitBtn;
OpenDialog1: TOpenDialog;
procedure BrowseBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit_pathChange(Sender: TObject);
procedure BackDataClick(Sender: TObject);
procedure CancelBtnClick(Sender: TObject);
procedure RecoverDataClick(Sender: TObject);
private
{ Private declarations }
public
B_showmessage: boolean;
{ Public declarations }
end;var
DataBack: TDataBack;implementationuses SelectDirUnit, Udm;{$R *.dfm}procedure TDataBack.BrowseBtnClick(Sender: TObject);
begin
Application.CreateForm(TSelectDir, SelectDir); //显示路径选择窗体
SelectDir.DriveComboBox1.Text := ExtractFileDrive(Edit_path.Text);
if (FileExists(Edit_path.Text)) then //检测路径是否存在
SelectDir.DirectoryListBox1.Directory := Edit_path.Text;
if (SelectDir.ShowModal = mrOK) then //当返回值为mrOK时,得到选择的路径
Edit_path.Text := SelectDir.Label3.Caption + ‘\XQ’ +
formatdatetime(’yyyymmdd’, date) + ‘.back’;
SelectDir.free;
end;procedure TDataBack.FormCreate(Sender: TObject);
var
SourcePath: string;
begin
SELF.Caption := application.Title + ‘ - 数据备份’;
B_showmessage := true;
SourcePath := ExtractFileDir(Application.ExeName);
//取得应用程序路径
if (StrLen(PChar(SourcePath)) <> 3) then
SourcePath := SourcePath + ‘\’;
Edit_path.Text := SourcePath + ‘BACKUPDATA\XQ’ + formatdatetime(’yyyymmdd’,
date) + ‘.back’;
//设置路径名+文件名
end;procedure TDataBack.Edit_pathChange(Sender: TObject);
begin
if trim(Edit_path.Text) <> ” then
BackData.Enabled := True
else
RecoverData.Enabled := False; //当路径框中为空时候, 恢复数据不可用
end;procedure TDataBack.BackDataClick(Sender: TObject);
begin
self.Caption := ‘正在备份数据….’;
a1.Active := true;
adodm.cback.CommandText := ‘backup database xq to disk=”’ + Edit_path.Text +
””; //备份数据库命令语句
try
adodm.cback.Execute;
// 执行备份
showmessage(’ 备份成功!’);
a1.Active := false;
except
showmessage(’ 备份失败!’);
a1.Active := false;
end;
self.Caption := ‘数据备份和恢复’;
end;procedure TDataBack.CancelBtnClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;procedure TDataBack.RecoverDataClick(Sender: TObject);
var
DataPath: string;
begin
self.Caption := ‘正在恢复数据….’;
try
adodm.XQconn.Close;
adodm.XQconn.Connected := false;
except
MessageBox(0, ‘关闭数据库错误’, ‘错误’, MB_OK + MB_ICONSTOP + MB_TOPMOST);
end; OpenDialog1.Filter := ‘备份文件 (*.back)|*.back|所有文件 (*.*)|*.*’;
//设置备份文件后缀
OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName) + ‘\backupdata’;
//设置备份路径
if OpenDialog1.Execute then
DataPath := OpenDialog1.FileName;
if DataPath <> ” then
begin
if
application.MessageBox(’此操作将使上次备份以来的所有数据丢失,是否继续?’,
‘恢复数据’, MB_OKCANCEL) = idOK then
begin
a1.Active := true;
ADODM.backconn.Connected := True;
adodm.cback.Connection := ADODM.backconn;
adodm.cback.CommandText :=
‘ALTER DATABASE XQ SET OFFLINE WITH ROLLBACK IMMEDIATE’; //切断连接
adodm.cback.Execute;
adodm.cback.CommandText := ‘restore database XQ from disk=”’ + DataPath +
”” + ‘ with replace’; //恢复数据命令语句
try
try
adodm.cback.Execute;
//执行恢复过程
showmessage(’ 恢复成功!’);
except
showmessage(’数据库正在被使用!请确定已关闭其它使用该数据库程序!’);
showmessage(’ 恢复失败!’);
end;
finally
a1.Active := false;
adodm.cback.CommandText :=
‘ALTER DATABASE XQ SET ONLINE WITH ROLLBACK IMMEDIATE’; //重新连接数据库
adodm.cback.Execute;
// 关闭临时数据库
ADODM.backconn.Connected := False;
// 打开数据库
adodm.ClientFamily.CommandText := ’select * from ClientFamilyTable’;
ADODM.XQconn.Connected := True;
try
// 打开各个数据表是否有错误
adodm.YHTS.Open;
adodm.part.Open;
adodm.client.Open;
adodm.Toper.Open;
adodm.Tuser.Open;
adodm.ZHBX.Open;
adodm.Model.Open;
adodm.ClientFamily.Open;
adodm.ChargeItem.Open;
adodm.ClientRoom.Open;
adodm.Charge.Open;
adodm.ClientPay.Open;
adodm.ClientAdvance.Open;
except
showmessage(’程序运行发生不可预知错误,请重新启动程序!’);
//结束该程序
Application.Terminate;
end;
end;
end;
end;
self.Caption := ‘数据备份和恢复’;
end;end.
恢复就要先断开当前的连接,然后恢复。。
代码太多,有点乱!
procedure TDataBack.RecoverDataClick(Sender: TObject);
var
DataPath: string;
begin
self.Caption := ‘正在恢复数据….’;
try
adodm.XQconn.Close;
adodm.XQconn.Connected := false;
except
MessageBox(0, ‘关闭数据库错误’, ‘错误’, MB_OK + MB_ICONSTOP + MB_TOPMOST);
end;
//恢复数据库是独占的,恢复的时候你需要关闭所有的连接,本机的,其他机器的。
//因此你需要一个新的连接或者改变连接到master数据库或其他非恢复数据,这样才能正确执行SQL语句。
OpenDialog1.Filter := ‘备份文件 (*.back)|*.back|所有文件 (*.*)|*.*’;
//设置备份文件后缀
OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName) + ‘\backupdata’;
//设置备份路径
if OpenDialog1.Execute then
DataPath := OpenDialog1.FileName;
if DataPath <> ” then
begin
if
application.MessageBox(’此操作将使上次备份以来的所有数据丢失,是否继续?’,
‘恢复数据’, MB_OKCANCEL) = idOK then
begin
a1.Active := true;
ADODM.backconn.Connected := True;
adodm.cback.Connection := ADODM.backconn;
adodm.cback.CommandText :=
‘ALTER DATABASE XQ SET OFFLINE WITH ROLLBACK IMMEDIATE’; //切断连接
adodm.cback.Execute;
adodm.cback.CommandText := ‘restore database XQ from disk=”’ + DataPath +
”” + ‘ with replace’; //恢复数据命令语句
try
try
adodm.cback.Execute;
//执行恢复过程
showmessage(’ 恢复成功!’);
except
showmessage(’数据库正在被使用!请确定已关闭其它使用该数据库程序!’);
showmessage(’ 恢复失败!’);
exit;//恢复失败就退出吧,后来的操作就都没有必要执行了。
end;
finally
a1.Active := false;
adodm.cback.CommandText :=
‘ALTER DATABASE XQ SET ONLINE WITH ROLLBACK IMMEDIATE’; //重新连接数据库
adodm.cback.Execute;
// 关闭临时数据库
ADODM.backconn.Connected := False;
// 打开数据库
adodm.ClientFamily.CommandText := ’select * from ClientFamilyTable’;
ADODM.XQconn.Connected := True;
try
// 打开各个数据表是否有错误
adodm.YHTS.Open;
adodm.part.Open;
adodm.client.Open;
adodm.Toper.Open;
adodm.Tuser.Open;
adodm.ZHBX.Open;
adodm.Model.Open;
adodm.ClientFamily.Open;
adodm.ChargeItem.Open;
adodm.ClientRoom.Open;
adodm.Charge.Open;
adodm.ClientPay.Open;
adodm.ClientAdvance.Open;
except
showmessage(’程序运行发生不可预知错误,请重新启动程序!’);
//结束该程序
Application.Terminate;
end;
end;
end;
end;
self.Caption := ‘数据备份和恢复’;
end;a1是什么东东?恢复数据库的过程
1.先保存连接
2.关闭与之连接的所有query,table等数据库操作的内容。
3.建立一个其他的连接或者是更改连接。
4.杀死所有与要恢复数据库的连接(有脚本,自己google)
5.恢复数据库(注意恢复失败的处理)
6.根据保存的连接恢复连接。
7.打开你原有与之相关的dataset。
//因此你需要一个新的连接或者改变连接到master数据库或其他非恢复数据,这样才能正确执行SQL语句。
注意上一帖的注释。
//-----备份-----
procedure TFBackDB.btn_bfClick(Sender: TObject);
var
strfile: string;
adoqdb: TADOQuery;
begin
if Trim(ed_bfpath.Text) <> '' then
begin
adoqdb := TADOQuery.Create(nil);
adoqdb.Connection := Fdm.adodx;
strfile := SaveDB.FileName;
if FileExists(strfile) then
begin
if Application.MessageBox(PChar('文件' + strfile + '已经存在,是否覆盖?'), PChar('XiaTMS'), MB_YESNO + 64) = mrYes then
begin
DeleteFile(strfile);
try
adoqdb.Close;
adoqdb.SQL.Clear;
adoqdb.SQL.Add('backup database XiaTMS to disk=''' + strfile + ''''); //XiaTMS为数据库名称
adoqdb.ExecSQL;
adoqdb.Free;
Application.MessageBox(PChar('数据库已经备份到' + strfile + ''), PChar('XiaTMS'), MB_OK + MB_ICONINFORMATION);
ed_bfpath.Clear;
Close;
except
Application.MessageBox(PChar('文件写入错误!'), PChar('XiaTMS'), MB_OK + MB_ICONERROR);
end;
end
else
exit;
end
else
begin
try
adoqdb.Close;
adoqdb.SQL.Clear;
adoqdb.SQL.Add('backup database XiaTMS to disk=''' + strfile + ''''); //XiaTMS为数据库名称
adoqdb.ExecSQL;
adoqdb.Free;
Application.MessageBox(PChar('数据库已经备份到' + strfile + ''), PChar('XiaTMS'), MB_OK + MB_ICONINFORMATION);
ed_bfpath.Clear;
Close;
except
Application.MessageBox(PChar('文件写入错误!'), PChar('XiaTMS'), MB_OK + MB_ICONERROR);
end;
end;
end
else
Application.MessageBox(PChar('请选择数据库备份路径!'), PChar('XiaTMS'), MB_OK + MB_ICONINFORMATION)
end;//还原
procedure TFredb.btn_hyClick(Sender: TObject);
var
strfile: string;
adomaster: TADOQuery;
begin
if Trim(ed_hypath.Text) <> '' then
begin
adomaster := TADOQuery.Create(nil);
adomaster.Connection := ADODBConn;
strfile := OpenDB.FileName;
if Application.MessageBox(PChar('是否要还原 ' + strfile + ' 数据库?'), PChar('XiaTMS'), MB_YESNO + 64) = mrYes then
begin
try
Fdm.adodx.Close; //关闭XiaTMS数据库的连接
ADODBConn.Connected := True; //打开Master数据库连接 adomaster.Close;
adomaster.SQL.Clear;
adomaster.SQL.Add('alter database XiaTMS set offline with rollback immediate'); //从数据库中断开XiaTMS数据库的连接
adomaster.ExecSQL; adomaster.Close;
adomaster.SQL.Clear;
adomaster.SQL.Add('restore database XiaTMS From disk=''' + strfile + ''' '); //还原XiaTMS数据库
adomaster.ExecSQL;
adomaster.Free; ADODBConn.Close; //关闭Master数据库连接
Fdm.adodx.Connected := True; //打开XiaTMS数据库的连接 Application.MessageBox(PChar('数据库恢复成功!'), PChar('XiaTMS'), MB_OK + MB_ICONINFORMATION);
ed_hypath.Clear;
Close;
except
Application.MessageBox(PChar('数据库联接错误!'), PChar('XiaTMS'), MB_OK + MB_ICONERROR);
end;
end;
end
else
Application.MessageBox(PChar('请选择数据库备份文件!'), PChar('XiaTMS'), MB_OK + MB_ICONINFORMATION)
end;