公告

國明的網路筆記

2012年8月29日 星期三

透過 BCB6 備份 MSSQL 資料庫


透過BCB備份MSSQL資料庫

首先到MSSQL的資料庫(master)中建立一個「預存程序(stored procedure)」:
CREATE PROCEDURE backupdb
  @dbName varchar(10),
  @directory varchar(100)
AS
  backup database @dbName
  to disk=@directory

然後到BCB中建立一個新的專案(Project1),使用三個元件(Button1, ADOConnection1, ADOStoredProc1),請先設定ADOConnection1中的ConnectionString的屬性,使之與MSSQL連結。

BCB6 程式碼如下:
String __fastcall TForm1::GetSqlServerPath() // 抓取MSSQL路徑
{
  String result,tmp;

  TADOQuery *Query = new TADOQuery(this);
  Query->Connection = ADOConnection1;
  Query->Close();
  Query->SQL->Clear();
  Query->SQL->Add("select filename from sysdatabases where name='master'"); // 單引號中的master改為要備份的資料庫名稱
  Query->Open();
  tmp = Query->FieldByName("filename")->AsString;
  result = tmp.SubString(1, tmp.Length() - 15); // 取得資料庫路徑
  Query->Free();
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String daStr = FormatDateTime("yyyy-mm-dd hh-mm-ss",Now());
  try{
     String path = Form1->GetSqlServerPath() + "backup";
     ADOStoredProc1->Close();
     ADOStoredProc1->Connection=ADOConnection1;
     ADOStoredProc1->Prepared = true;
     ADOStoredProc1->ProcedureName = "backupdb;1";
     ADOStoredProc1->Parameters->ParamByName("@dbName")->Value = "master"; // 為要備份的資料庫名稱
     ADOStoredProc1->Parameters->ParamByName("@directory")->Value = path+" \\ master" + daStr; // 此處請注意因Blog關係,請將雙引號中的空格刪除,原程式中沒有空格,若不刪除空格可能造成備份檔案路徑不正確。
     ADOStoredProc1->ExecProc();
     Application->MessageBox("備份完成", "提示", MB_OK + MB_ICONINFORMATION);
     this->Close();
   }
   catch(...)
  {
     Application->MessageBox("備份出錯,請重新再來", "警告", MB_OK + MB_ICONWARNING);
     return;
   }
}
//---------------------------------------------------------------------------

(參考 http://blog.roodo.com/techcity/archives/9875671.html )