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

📄 dr_main.pas

📁 亚惠快餐管理信息系统 包括亚惠快餐管理的各项功能
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      except
        ShowMessage('error');
        Exit;
      end;
      if DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.RecordCount = 0
        then
      begin
        ReplaceDatabaseCheckBox.Checked := False;
        Exit;
      end;
      TemporaryHistoryDeviceName :=
        DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.FieldByName('Logical_Device_Name').AsString;
      if Trim(TemporaryHistoryDeviceName) = '' then
        TemporaryHistoryDeviceName := 'disk=''' +
          DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.FieldByName('Physical_Device_Name').AsString + '''';
      TemporaryHistoryBackupSetNumber :=
        DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.FieldByName('position').AsString;
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Close;
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Sql.Clear;
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Sql.Add('RESTORE FILELISTONLY FROM ' + TemporaryHistoryDeviceName);
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.SQL.Add('with file=' +
        TemporaryHistoryBackupSetNumber);
    end
      //设备状态恢复=============================
    else
    begin
      if DestinationListBox.Items.Count = 0 then
      begin
        ReplaceDatabaseCheckBox.Checked := False;
        Exit;
      end;
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Close;
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Sql.Clear;
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Sql.Add('RESTORE FILELISTONLY FROM ' + DestinationListBox.Items[0]);
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.SQL.Add('with file=' +
        DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('Position').AsString);
    end;
    //公共部分=================================
    try
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Open;
    except
      ShowMessage('无法创建新库或覆盖原有数据库!');
      Exit;
    end;
    while not DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Eof do
    begin
      SourceDatabaseFileName := '';
      DestinationDatabaseFileName := '';
      SourceDatabaseMemo.Lines.Add(DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.FieldByName('LogicalName').AsString);
      SourceDatabaseFileName :=
        DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.FieldByName('PhysicalName').AsString;
      while Pos('\', SourceDatabaseFileName) <> 0 do
      begin
        DestinationDatabaseFileName := DestinationDatabaseFileName +
          Copy(SourceDatabaseFileName, 1, Pos('\', SourceDatabaseFileName));
        SourceDatabaseFileName := Copy(SourceDatabaseFileName, Pos('\',
          SourceDatabaseFileName) + 1, Length(SourceDatabaseFileName) - Pos('\',
          SourceDatabaseFileName));
      end;
      if Pos('_', SourceDatabaseFileName) <> 0 then
        DestinationDatabaseFileName := DestinationDatabaseFileName +
          AfterRestorDatabaseNameComboBox.Text + Copy(SourceDatabaseFileName,
          Pos('_', SourceDatabaseFileName), Length(SourceDatabaseFileName) -
          Pos('_', SourceDatabaseFileName) + 1)
      else
        DestinationDatabaseFileName := DestinationDatabaseFileName +
          AfterRestorDatabaseNameComboBox.Text + Copy(SourceDatabaseFileName,
          Pos('.', SourceDatabaseFileName), Length(SourceDatabaseFileName) -
          Pos('.', SourceDatabaseFileName) + 1);
      DestinationDatabaseMemo.Lines.Add(DestinationDatabaseFileName);
      DR_DfmDataModule1.SourceDestinationDatabaseADOQuery.Next;
    end;
  end
    //不覆盖================================
  else
  begin
    SourceDatabaseMemo.Lines.Clear;
    DestinationDatabaseMemo.Lines.Clear;
    DestinationDatabaseMemo.ReadOnly := True;
  end;
end;

//恢复按钮======================================================================

procedure TDR_DfmMain.ConfirmButtonClick(Sender: TObject);
var
  TemporaryHistoryDeviceName: string;
  TemporaryHistoryBackupSetNumber: string;
  i: integer;
begin
  //历史恢复==================================
  if RestoreModeRadioGroup.ItemIndex = 0 then
  begin
    if DR_DfmDataModule1.BackupHistoryADOQuery.RecordCount = 0 then
      Exit;
    if (Trim(RestoreDatabaseNameComboBox.Text) <>
      Trim(AfterRestorDatabaseNameComboBox.Text)) and
      (ReplaceDatabaseCheckBox.Checked = False) then
    begin
      ShowMessage('源数据库名称和恢复后数据库名称不符,如果确想恢复,请选择“创建新库“选项!');
      Exit;
    end;
    if (Trim(RestoreDatabaseNameComboBox.Text) <>
      Trim(AfterRestorDatabaseNameComboBox.Text)) and
      (ReplaceDatabaseCheckBox.Checked = True) then
    begin
      if DatabaseNames.IndexOf(Trim(AfterRestorDatabaseNameComboBox.Text)) <> -1
        then
      begin
        ShowMessage('该库已存在,请另选库名');
        Exit;
      end;
    end;
    if (Trim(RestoreDatabaseNameComboBox.Text) =
      Trim(AfterRestorDatabaseNameComboBox.Text)) and
      (ReplaceDatabaseCheckBox.Checked = True) then
    begin
      ShowMessage('源数据库名称和恢复后数据库名称相同,请取消“创建新库“选项!');
      Exit;
    end;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Close;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Clear;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Add('Select * From msdb..BackupMediaFamily Inner Join msdb..BackupSet On msdb..BackupMediaFamily.Media_Set_Id=msdb..BackupSet.Media_Set_Id Where msdb..BackupSet.Backup_Set_Id=' +
      DR_DfmDataModule1.BackupHistoryADOQuery.FieldByName('Backup_Set_Id').AsString);
    try
      DR_DfmDataModule1.RestoreDatabaseADOQuery.Open;
    except
      ShowMessage('error');
      Exit;
    end;
    TemporaryHistoryDeviceName :=
      DR_DfmDataModule1.RestoreDatabaseADOQuery.FieldByName('Logical_Device_Name').AsString;
    if Trim(TemporaryHistoryDeviceName) = '' then
      TemporaryHistoryDeviceName := 'disk=''' +
        DR_DfmDataModule1.RestoreDatabaseADOQuery.FieldByName('Physical_Device_Name').AsString + '''';
    TemporaryHistoryBackupSetNumber :=
      DR_DfmDataModule1.RestoreDatabaseADOQuery.FieldByName('position').AsString;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Close;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Clear;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Add('use master');
    if ((DR_DfmDataModule1.BackupHistoryADOQuery.FieldByName('type').AsString =
      'D') or
      (DR_DfmDataModule1.BackupHistoryADOQuery.FieldByName('type').AsString
      = 'I')) then
      DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Add('restore database ' +
        AfterRestorDatabaseNameComboBox.Text)
    else if DR_DfmDataModule1.BackupHistoryADOQuery.FieldByName('type').AsString
      = 'L' then
      DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Add('restore Log ' +
        AfterRestorDatabaseNameComboBox.Text)
    else
      Exit;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add('From ' +
      TemporaryHistoryDeviceName);
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add('with DBO_ONLY');
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add(',file=' +
      TemporaryHistoryBackupSetNumber);
  end
    //设备恢复=====================
  else
  begin
    if DestinationListBox.Items.Count = 0 then
      Exit;
    if
      (Trim(DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('DatabaseName').AsString) <> Trim(AfterRestorDatabaseNameComboBox.Text)) and
      (ReplaceDatabaseCheckBox.Checked = False) then
    begin
      ShowMessage('源数据库名称和恢复后数据库名称不符,如果确想恢复,请选择“创建新库“选项!');
      Exit;
    end;
    if
      (Trim(DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('DatabaseName').AsString) <> Trim(AfterRestorDatabaseNameComboBox.Text)) and
      (ReplaceDatabaseCheckBox.Checked = True) then
    begin
      if DatabaseNames.IndexOf(Trim(AfterRestorDatabaseNameComboBox.Text)) <> -1
        then
      begin
        ShowMessage('该库已存在,请另选库名');
        Exit;
      end;
    end;
    if
      (Trim(DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('DatabaseName').AsString) = Trim(AfterRestorDatabaseNameComboBox.Text)) and
      (ReplaceDatabaseCheckBox.Checked = True) then
    begin
      ShowMessage('源数据库名称和恢复后数据库名称相同,请取消“创建新库“选项!');
      Exit;
    end;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Close;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Clear;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Add('Use master');
    if
      ((DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('BackupType').AsString = '1') or
      (DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('BackupType').AsString = '5')) then
      DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Add('restore database ' +
        AfterRestorDatabaseNameComboBox.Text)
    else if
      DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('BackupType').AsString = '2' then
      DR_DfmDataModule1.RestoreDatabaseADOQuery.Sql.Add('restore Log ' +
        AfterRestorDatabaseNameComboBox.Text)
    else
      Exit;
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add('From ' +
      DestinationListBox.Items[0]);
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add('with DBO_ONLY');
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add(',file=' +
      DR_DfmDataModule1.BackupDeviceContentADOQuery.FieldByName('Position').AsString);
  end;
  //公共部分============================
  if ReplaceDatabaseCheckBox.Checked = True then
  begin
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add(',replace');
    for i := 0 to SourceDatabaseMemo.Lines.Count - 1 do
    begin
      DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add(',Move ''' +
        SourceDatabaseMemo.Lines[i] + ''' to ''' +
        DestinationDatabaseMemo.Lines[i]
        + '''');
    end;
  end;
  if AfterRestoreStatusRadioGroup.ItemIndex = 0 then
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add(',norecovery')
  else
    DR_DfmDataModule1.RestoreDatabaseADOQuery.SQL.Add(',recovery');
  Animate1.Visible := True;
  Animate1.Active := True;
  Screen.Cursor := crHourGlass;
  try
    DR_DfmDataModule1.RestoreDatabaseADOQuery.ExecSQL;

  except
    Screen.Cursor := crDefault;
    Animate1.Active := False;
    Animate1.Visible := False;
    ShowMessage('恢复不成功,该备份设备不能使用或恢复操作不当!');
    Exit;
  end;
  Screen.Cursor := crDefault;
  Animate1.Active := False;
  Animate1.Visible := False;
  ShowMessage('恢复完成!');
  Close;
end;

//覆盖已有数据库选项变动事件====================================================

procedure TDR_DfmMain.ReplaceDatabaseCheck;
begin
  if ReplaceDatabaseCheckBox.Checked = False then
    Exit;
  ReplaceDatabaseCheckBox.Checked := False;
  SourceDatabaseMemo.Lines.Clear;
  DestinationDatabaseMemo.Lines.Clear;
  DestinationDatabaseMemo.ReadOnly := True;
end;

//目标数据库变动================================================================

procedure TDR_DfmMain.AfterRestorDatabaseNameComboBoxChange(
  Sender: TObject);
begin
  ReplaceDatabaseCheck;
end;

procedure TDR_DfmMain.TADOQueryAfterScroll(DataSet: TDataSet);
begin
  if not DR_DfmDataModule1.BackupDeviceContentADOQuery.Active then
    Exit;
  ReplaceDatabaseCheck;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -