望高手帮忙看一下代码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.

解决方案 »

  1.   

    备份直接就可以用SQL语句执行,
    恢复就要先断开当前的连接,然后恢复。。
    代码太多,有点乱!
      

  2.   


    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。
      

  3.   

    //恢复数据库是独占的,恢复的时候你需要关闭所有的连接,本机的,其他机器的。
    //因此你需要一个新的连接或者改变连接到master数据库或其他非恢复数据,这样才能正确执行SQL语句。

    注意上一帖的注释。
      

  4.   


    //-----备份-----
    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;