📄 mainform.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 + -