📄 backdatac.pas
字号:
unit backdatac;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, GX_Outlook, ActnList, ImgList, ComCtrls, XPMenu,
StdCtrls, XPMenu2, DB, ADODB, AAFont, AACtrls, Grids, DBGrids,FileCtrl,shellapi,
Buttons;
type
Tdatabackrecw = class(TForm)
Panel3: TPanel;
ActionList1: TActionList;
Action1: TAction;
Action2: TAction;
ImageList1: TImageList;
startback: TAction;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
ADOQuery2: TADOQuery;
ADOQuery3: TADOQuery;
ADOConnection1: TADOConnection;
Panel1: TPanel;
AALabel1: TAALabel;
Panel2: TPanel;
FEGXOutlookBar1: TFEGXOutlookBar;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Button1: TButton;
GroupBox1: TGroupBox;
DBGrid1: TDBGrid;
TabSheet2: TTabSheet;
BitBtn1: TBitBtn;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
recdata: TAction;
OpenDialog1: TOpenDialog;
Button2: TButton;
GroupBox2: TGroupBox;
DBGrid2: TDBGrid;
CheckBox1: TCheckBox;
XPMenu21: TXPMenu2;
Label1: TLabel;
procedure Action1Execute(Sender: TObject);
procedure startbackExecute(Sender: TObject);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Action2Execute(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure recdataExecute(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
GAdoConString:string;
function logintoserver:boolean;
function CCopyFile(sr:string;ds:string ):integer;
function clearret(s:string):string;
end;
var
databackrecw: Tdatabackrecw;
implementation
uses logintoc,showstopserverc, inputdatabasenamec;
{$R *.dfm}
function Tdatabackrecw.logintoserver:boolean;
begin
result:=false;
if logintow.showmodal=mrok then
begin
GAdoConString:='Provider=SQLOLEDB.1;Password='+logintow.LabeledEdit2.text
+';Persist Security Info=True;'+
'User ID='+logintow.LabeledEdit1.text
+';Initial Catalog=master'
+';Data Source='+logintow.LabeledEdit3.text;
ADOConnection1.Close;
ADOConnection1.ConnectionString:=GAdoConString;
result:=true;
end;
end;
function Tdatabackrecw.clearret(s:string):string;
begin
result:=TrimRight(StringReplace(s,#13#10,'',[rfReplaceAll]));
result:=TrimRight(StringReplace(result,' ','',[rfReplaceAll]));
end;
function Tdatabackrecw.CCopyFile(sr:string;ds:string):integer;
var
fsTemp:SHFILEOPSTRUCT;
begin
fsTemp.Wnd := Self.Handle;
fsTemp.wFunc :=FO_COPY;
fsTemp.fFlags :=FOF_ALLOWUNDO;
fsTemp.pFrom :=pchar(sr+#0#0);
fsTemp.pTo := pchar(ds+#0#0);
fsTemp.lpszProgressTitle:='复制文件';
result:=SHFileOperation(fsTemp);
if result<>0 then
ShowMessage('文件复制失败');
end;
procedure Tdatabackrecw.Action1Execute(Sender: TObject);
begin
ADOQuery1.Close;
if logintoserver then
begin
ADOQuery1.Open;
//如果你想自动选择某数据库,可以修改这里
//ADOQuery1.Locate('name','database',[loPartialKey]);
TabSheet1.TabVisible:=true;
TabSheet2.TabVisible:=False;
end;
end;
procedure Tdatabackrecw.startbackExecute(Sender: TObject);
var
odir:string;
backdatabasename,backdatabasename2:string;
backtofileandpath:string;
rshowstopserverw: Tshowstopserverw;
begin
rshowstopserverw:=Tshowstopserverw.create(self);
try
rshowstopserverw.AAFadeText1.Text.Lines.LoadFromFile(ExtractFilePath(Application.ExeName)+'备份提示.txt');
rshowstopserverw.AAFadeText1.Active:=true;
try
if not SelectDirectory('请选择存储位置,数据将备份到指定位置','',odir) then exit;
if rshowstopserverw.ShowModal<>mrok then exit;
backdatabasename2:=DBGrid1.DataSource.DataSet.fieldbyname('name').asstring;
backdatabasename:='"'+backdatabasename2+'"'; //要备份的数据库名带双引号
backtofileandpath:=''''+odir+'\'+backdatabasename2+'.bak'+'''';
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('BACKUP DATABASE '+backdatabasename+' TO DISK ='+backtofileandpath);
ADOQuery2.ExecSQL;
Application.MessageBox(pchar('备份成功完成!'+#13+'已生成备份文件:'+backtofileandpath)
,'',MB_OK+MB_ICONINFORMATION);
finally
ADOQuery2.Close;
ADOQuery3.Close;
ADOQuery1.Close;
ADOQuery1.Open;
rshowstopserverw.free;
end;
except
raise;
end;
end;
procedure Tdatabackrecw.DataSource1DataChange(Sender: TObject;
Field: TField);
begin
startback.Enabled:=(ADOQuery1.RecordCount<>0);
end;
procedure Tdatabackrecw.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ADOQuery1.close;
ADOQuery2.close;
end;
procedure Tdatabackrecw.Action2Execute(Sender: TObject);
begin
ADOQuery1.Close;
if logintoserver then
begin
ADOQuery1.Open;
//如果你想自动选择某数据库,可以修改这里
// ADOQuery1.Locate('name','database',[loPartialKey]);
TabSheet1.TabVisible:=false;
TabSheet2.TabVisible:=true;
end;
end;
procedure Tdatabackrecw.FormShow(Sender: TObject);
begin
TabSheet1.TabVisible:=false;
TabSheet2.TabVisible:=false;
end;
procedure Tdatabackrecw.recdataExecute(Sender: TObject);
var
datafilename,dsdbname:string;
rshowstopserverw: Tshowstopserverw;
dspath:string;//目的路径
rinputdatabasenamew: Tinputdatabasenamew;
begin
rshowstopserverw:=Tshowstopserverw.Create(self);
rinputdatabasenamew:=Tinputdatabasenamew.create(self);
try
try
rshowstopserverw.AAFadeText1.Text.Lines.LoadFromFile(ExtractFilePath(Application.ExeName)+'恢复提示.txt');
if OpenDialog1.Execute then
begin
dsdbname:='"'+ADOQuery1.fieldbyname('name').asstring+'"';//目的数据库
dspath:=ExtractFilePath(ADOQuery1.fieldbyname('filename').asstring);//目的数据库文件物理位置
if Application.MessageBox(
pchar('警告,数据库:'+dsdbname+'的原有数据将被覆盖,而且不可恢复确定吗?'),
pchar('警告'),MB_YesNo+MB_ICONWARNING+MB_DEFBUTTON2)<>IDYes then exit;
rshowstopserverw.Caption:='数据恢复中...';
rshowstopserverw.AAFadeText1.Active:=true;
if rshowstopserverw.Showmodal<>mrok then exit;
datafilename:=OpenDialog1.FileName;//源数据库文件
LabeledEdit1.Text:=datafilename;
ADOQuery2.close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('RESTORE FILELISTONLY FROM DISK =');
ADOQuery2.SQL.Add(''''+datafilename+'''');
ADOQuery2.Open;
adoquery3.SQL.clear;
adoquery3.SQL.Add('RESTORE DATABASE'+dsdbname);
adoquery3.SQL.Add(' FROM DISK = '+''''+datafilename+'''');
ADOQuery3.SQL.Add('WITH Replace, MOVE '+''''+ADOQuery2.fieldbyname('logicalname').AsString+''''+
' TO '+''''+dspath+ExtractFileName(ADOQuery2.fieldbyname('physicalname').AsString)+'''');
ADOQuery2.next;
ADOQuery3.SQL.Add(', Move '+''''+ADOQuery2.fieldbyname('logicalname').AsString+''''+
' TO '+''''+dspath+ExtractFileName(ADOQuery2.fieldbyname('physicalname').AsString)+'''');
adoquery3.ExecSQL;
Application.MessageBox(pchar('恢复操作成功!'),'',MB_OK+MB_ICONINFORMATION);
end;
finally
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery2.Close;
ADOQuery3.Close;
rinputdatabasenamew.free;
rshowstopserverw.free;
end;
except
raise
end;
end;
procedure Tdatabackrecw.FormDestroy(Sender: TObject);
begin
ADOConnection1.Close;
ADOQuery1.Close;
ADOQuery2.Close;
ADOQuery3.Close;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -