📄 dr_main.pas
字号:
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 + -