⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 backdatac.pas

📁 用于备份与恢复 SQL Server 数据库
💻 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 + -