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

📄 restore.cpp

📁 速达开源ERP系统
💻 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 + -