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

📄 mainform.cpp

📁 该程序实现了SQL数据库文件(mdf,ldf)的自动安装,备份及还原.
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>

#pragma hdrstop

#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cxShellBrowserDialog"
#pragma resource "*.dfm"
TMainInstallForm *MainInstallForm;

LPSTR cmdStr;
//---------------------------------------------------------------------------
__fastcall TMainInstallForm::TMainInstallForm(TComponent* Owner)
        : TForm(Owner),HasLogged(false)
{
    DBNames = new TStringList();
}
//---------------------------------------------------------------------------
AnsiString __fastcall TMainInstallForm::GetConnString()
{
    AnsiString rslt = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=";
    rslt = rslt + Trim( edtUserName->Text ) + ";Initial Catalog=master;Data Source=";
    rslt = rslt + Trim( edtServerName->Text ) + ";Password=\"" + edtPassword->Text + "\"";
    return rslt;
}
//---------------------------------------------------------------------------
void __fastcall TMainInstallForm::btnTestConnectionClick(TObject *Sender)
{
    if( HasLogged )
    {
        conDB->Connected = false;
        HasLogged = false;
        EnableCtrls( true, CTRLS_ID_LOGIN );
        EnableCtrls( false, CTRLS_ID_BACKUP );
        EnableCtrls( false, CTRLS_ID_RESTORE );
        EnableCtrls( false, CTRLS_ID_RESTORE_NEW );
        EnableCtrls( false, CTRLS_ID_RESTORE_EXIST );
        btnTestConnection->Caption = "登录(&L)";
    }
    else
    {
        try
        {
           conDB->Connected = false;
           conDB->ConnectionString = GetConnString();
           conDB->Connected = true;
           if( conDB->Connected )
               ShowMessage("登录到数据库服务器成功!");
           HasLogged = true;
           EnableCtrls( false, CTRLS_ID_LOGIN );
           EnableCtrls( true, CTRLS_ID_BACKUP );
           EnableCtrls( true, CTRLS_ID_RESTORE );
           if( rbRestoreToExist->Checked )
           {
                EnableCtrls( false, CTRLS_ID_RESTORE_NEW );
                EnableCtrls( true, CTRLS_ID_RESTORE_EXIST );
           }
           else
           {
                EnableCtrls( true, CTRLS_ID_RESTORE_NEW );
                EnableCtrls( false, CTRLS_ID_RESTORE_EXIST );
           }

           btnTestConnection->Caption = "退出登录(&O)";
           if( RetriDatabases() )
           {
                cbbDBList->Items->Assign(DBNames);
                cbbRestoreDBList->Items->Assign(DBNames);
           }
        }
        catch(...)
        {
           ShowMessage("无法连接到数据库服务器,请检查连接参数是否正确。");
        }
    }
}
//---------------------------------------------------------------------------
bool __fastcall TMainInstallForm::BackupDB( const String& dbName,
                                            const String& backFile )
{
    try
    {
        AnsiString cmd = "backup database " + dbName + " to disk='" + backFile + "'";
        cmdAttach->CommandText = cmd;
        cmdAttach->Execute();
        return true;
    }
    catch(Exception& e)
    {
        ShowMessage(String("备份数据库失败。\n以下是系统给出的异常提示:\n\n") + e.Message );
        return false;
    }
}
//---------------------------------------------------------------------------

bool __fastcall TMainInstallForm::RestoreDB( const String& dbName,
                                   const String& backFile,
                                   const String& newDBLoc /*= ""*/ )
{
    try
    {
        AnsiString cmd = "restore database " + dbName + " from disk='" + backFile +
                         "' with replace";

        if( !newDBLoc.IsEmpty() )
        {
            String tmpLoc = newDBLoc.Trim();
            if( tmpLoc[tmpLoc.Length()] != '\\' )
                tmpLoc = tmpLoc + "\\";

            cmd = cmd + ",move 'tuition_database_dat' to '" + tmpLoc + dbName + ".mdf'," +
                  "move 'tuition_database_log' to '" + tmpLoc + dbName + ".ldf'";
        }

        cmdAttach->CommandText = cmd;
        cmdAttach->Execute();
        return true;
    }
    catch(Exception& e)
    {
        ShowMessage(String("无法恢复数据库:") + dbName + "。\n以下是系统给出的异常提示:\n\n" + e.Message );
        return false;
    }
}
//---------------------------------------------------------------------------

bool __fastcall TMainInstallForm::RetriDatabases()
{
    try
    {
        AnsiString cmd = "exec sp_databases";
        cmdAttach->CommandText = cmd;
        dsTemp->Recordset = cmdAttach->Execute();
        DBNames->Clear();
        while( !dsTemp->Eof )
        {
            DBNames->Add(dsTemp->FieldByName("DATABASE_NAME")->AsString);
            dsTemp->Next();
        }
        return true;
    }
    catch(Exception& e)
    {
        ShowMessage("错误:无法从数据库服务器上获得数据库列表。请检查您登录的用户是否拥有超级管理员权限!");
        return false;
    }
}
//---------------------------------------------------------------------------

void __fastcall TMainInstallForm::btnCancelClick(TObject *Sender)
{
    Close();        
}
//---------------------------------------------------------------------------
void __fastcall TMainInstallForm::FormShow(TObject *Sender)
{
    String hostName = cmdStr;
    hostName = hostName.Trim();
    if( !hostName.IsEmpty() )
    {
        edtServerName->Text = hostName;
    }

    EnableCtrls( false, CTRLS_ID_BACKUP );
    EnableCtrls( false, CTRLS_ID_RESTORE );
    EnableCtrls( false, CTRLS_ID_RESTORE_NEW );
    EnableCtrls( false, CTRLS_ID_RESTORE_EXIST );
}
//---------------------------------------------------------------------------

void __fastcall TMainInstallForm::EnableCtrls( bool en, int id )
{
    for( int i=0; i<ComponentCount; i++ )
    {
        TControl *ctl = dynamic_cast<TControl*>(Components[i]);
        if( ctl && ctl->Tag == id )
        {
            ctl->Enabled = en;
        }
    }
}
void __fastcall TMainInstallForm::FormDestroy(TObject *Sender)
{
    delete DBNames;    
}
//---------------------------------------------------------------------------

void __fastcall TMainInstallForm::btnBackupClick(TObject *Sender)
{
    if( cbbDBList->ItemIndex < 0 )
    {
        ShowMessage("请选择一个要备份的数据库!");
        return;
    }

    if( edtBackupTarget->Text.IsEmpty() )
    {
        ShowMessage("请选择数据备份到的目标位置!");
        return;
    }

    if( BackupDB( cbbDBList->Items->Strings[cbbDBList->ItemIndex], edtBackupTarget->Text ) )
    {
        ShowMessage( String("备份数据库 ") + cbbDBList->Items->Strings[cbbDBList->ItemIndex] + " 到 " + edtBackupTarget->Text + " 成功!" );
    }
}
//---------------------------------------------------------------------------


void __fastcall TMainInstallForm::btnBrowseBackupTargetClick(
      TObject *Sender)
{
    if( dlgSaveBackup->Execute() )
    {
        edtBackupTarget->Text = dlgSaveBackup->FileName;
    }
}
//---------------------------------------------------------------------------

void __fastcall TMainInstallForm::rbRestoreToExistClick(TObject *Sender)
{
     if( rbRestoreToExist->Checked )
     {
          EnableCtrls( false, CTRLS_ID_RESTORE_NEW );
          EnableCtrls( true, CTRLS_ID_RESTORE_EXIST );
     }
     else
     {
          EnableCtrls( true, CTRLS_ID_RESTORE_NEW );
          EnableCtrls( false, CTRLS_ID_RESTORE_EXIST );
     }
}
//---------------------------------------------------------------------------

void __fastcall TMainInstallForm::btnBrowseRestoreDbFileClick(
      TObject *Sender)
{
    if( dlgOpenBackup->Execute() )
    {
        edtRestoreFile->Text = dlgOpenBackup->FileName;
    }
}
//---------------------------------------------------------------------------


void __fastcall TMainInstallForm::btnBrowseNewDBLocClick(TObject *Sender)
{
    if( dlgBrowsePath->Execute() )
    {
        edtNewDBLoc->Text = dlgBrowsePath->Path;
    }
}
//---------------------------------------------------------------------------

void __fastcall TMainInstallForm::btnAttachClick(TObject *Sender)
{
    String restoreFile, restoreDB, restoreNewLoc;

    restoreFile = edtRestoreFile->Text.Trim();
    if( restoreFile.IsEmpty() )
    {
        ShowMessage("请指定要恢复的数据库备份文件!");
        return;
    }

    if( rbRestoreToExist->Checked )
    {
        if( cbbRestoreDBList->ItemIndex < 0 )
        {
            restoreDB = "";
        }
        else
        {
            restoreDB = cbbRestoreDBList->Items->Strings[ cbbRestoreDBList->ItemIndex ];
        }

        restoreNewLoc = "";
    }
    else
    {
        restoreDB = edtNewDBName->Text.Trim();
        restoreNewLoc = edtNewDBLoc->Text.Trim();
    }

    if( restoreDB.IsEmpty() )
    {
        ShowMessage("请选择一个要恢复到的目标数据库名!" );
        return;
    }

    if( rbRestoreToNew->Checked && restoreNewLoc.IsEmpty() )
    {
        ShowMessage( "请指定新数据库的存储位置!" );
        return;
    }

    if( Application->MessageBox( "警告:恢复数据库后,恢复的目标数据库中的内容将全部替换为备份文件里的内容!您确定要恢复吗?", "恢复数据库", MB_YESNO + 32 ) == IDYES )
    {
        if( RestoreDB( restoreDB, restoreFile, restoreNewLoc ) )
        {
            ShowMessage( String("恢复数据库 ") + restoreDB + " 从备份文件 " + restoreFile + " 成功!" );

            if( RetriDatabases() )
            {
                 cbbDBList->Items->Assign(DBNames);
                 cbbRestoreDBList->Items->Assign(DBNames);
            }
        }
    }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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