📄 restore.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Restore.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "fpanel"
#pragma link "RecListForm"
#pragma link "SDEdit"
#pragma resource "*.dfm"
TfrmRestore *frmRestore;
//---------------------------------------------------------------------------
__fastcall TfrmRestore::TfrmRestore(TComponent* Owner)
: TRecListForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmRestore::FormShow(TObject *Sender)
{
TComResultSet *ReStoreFile=NewResultSet();
TListItem *ListItem;
ReStoreFile->Open("select BackupDate,BackupFile,BackupUser from sdBackup order by BackupDate","");
if(ReStoreFile->RecordCount>0)
{
ReStoreFile->MoveFirst();
while( !ReStoreFile->Eof)
{
ListItem =ListBackupFile->Items->Add();
ListItem->Caption = ReStoreFile->FieldByName("BackupDate");
ListItem->SubItems->Add(ReStoreFile->FieldByName("BackupFile"));
ListItem->SubItems->Add(ReStoreFile->FieldByName("BackupUser"));
ReStoreFile->MoveNext();
}
}
ReStoreFile->Close();
delete ReStoreFile;
}
//---------------------------------------------------------------------------
void __fastcall TfrmRestore::ListBackupFileDblClick(TObject *Sender)
{
if(ListBackupFile->Selected==NULL)
return;
seRestoreFile->Text=ListBackupFile->Selected->SubItems->Strings[0];
}
//---------------------------------------------------------------------------
void __fastcall TfrmRestore::BtnCancelClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmRestore::BtnReStoreClick(TObject *Sender)
{
TComResultSet *ReStore=NewResultSet();
TComResultSet *KillProcess=NewResultSet();
AnsiString DatabaseName,FileName,ExeSql,KillSql;
int OwnSpid,Spid=-1;
try
{
if(seRestoreFile->Text.IsEmpty())
{
ShowMessageWindow("文件名不能为空!",mwsError);
return;
}
if(!FileExists(seRestoreFile->Text))
{
ShowMessageWindow("请输入合法的已存在的备份文件",mwsError);
return;
}
StartWaitForm("正在恢复数据,请稍候...");
ExeSql="Select OwnSpid=@@Spid" ;
ReStore->Open(ExeSql,"");
if(ReStore->RecordCount>0)
{
ReStore->MoveFirst();
OwnSpid=ReStore->FieldByName("OwnSpid").ToInt();
}
ReStore->Close();
if(OwnSpid<0)
throw Exception("不能确认当前进程!");
ExeSql="exec sp_Who" ;
ReStore->Open(ExeSql,"");
if(ReStore->RecordCount>1)
{
ReStore->MoveFirst();
while(!ReStore->Eof)
{
Spid=ReStore->FieldByName("Spid").ToInt();
if(Spid!=OwnSpid)
{
try
{
KillSql="Kill "+IntToStr(Spid);
KillProcess->Execute(KillSql);
}
catch(...)
{
//杀进程失败
}
}
else
{
DatabaseName=ReStore->FieldByName("dbname");
}
ReStore->MoveNext();
}
}
if(DatabaseName.IsEmpty())
throw Exception("不能确认当前连接数据库!");
DatabaseName=DatabaseName.Trim();
FileName=seRestoreFile->Text.Trim();
ExeSql="Use master";
ReStore->Execute(ExeSql);
ExeSql="Restore Database "+DatabaseName+" From DISK='"+FileName+"' with Replace";
try
{
ReStore->Execute(ExeSql);
ExeSql="Use "+DatabaseName;
ReStore->Execute(ExeSql);
ShowMessageWindow("数据恢复完成!",mwsInformation);
Close();
}
catch(Exception &e)
{
ExeSql="Use "+DatabaseName;
ReStore->Execute(WideString(ExeSql));
ShowMessageWindow("其它用户正在使用数据库,\n数据恢复失败,请重新操作",mwsError);
}
}
__finally
{
EndWaitForm();
delete ReStore;
delete KillProcess;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmRestore::seRestoreFileButtonClick(TObject *Sender)
{
if(!seRestoreFile->Text.IsEmpty())
OpenReStoreDialog->FileName=seRestoreFile->Text;
if(OpenReStoreDialog->Execute())
seRestoreFile->Text=OpenReStoreDialog->FileName;
}
//---------------------------------------------------------------------------
void __fastcall TfrmRestore::InitEditControl()
{
seRestoreFile->Text="";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -