本文示範在 C++Builder 環境下,客戶端透過 ADO 元件呼叫主資料庫預存程序,實現遠端備份 SQL Server 資料庫的完整流程。
CREATE PROCEDURE backupdb
@database varchar(10),
@directory varchar(100)
AS
BACKUP DATABASE @database
TO DISK = @directory
關鍵點:預存程序建立在 master 資料庫,接受資料庫名稱與備份路徑兩個參數。
AnsiString __fastcall TFrmDM::GetSqlServerPath() {
AnsiString result, tmp;
TADOQuery *Query = new TADOQuery(this);
Query->Connection = ADOConnection_Master;
Query->Close();
Query->SQL->Clear();
Query->SQL->Add("SELECT filename FROM sysdatabases WHERE name='master'");
Query->Open();
tmp = Query->FieldByName("filename")->AsString;
// 移除尾端 '\master.mdf' (15 字元) 取得資料目錄
result = tmp.SubString(1, tmp.Length() - 15);
Query->Free();
return result;
}
邏輯:查詢 master 資料庫檔案路徑,截取目錄部分作為備份基礎路徑。
// 產生含時間戳記的備份檔名
d = FormatDateTime("yyyy-mm-dd hh-mm-ss", FrmDM->GetServerTime());
try {
// 組合完整備份路徑
path = FrmDM->GetSqlServerPath() + "backup\\";
// 設定 ADOStoredProc 元件
FrmDM->ADOStoredProc1->Close();
FrmDM->ADOStoredProc1->Connection = FrmDM->ADOConnection_Master;
FrmDM->ADOStoredProc1->Prepared = true;
FrmDM->ADOStoredProc1->ProcedureName = "backupdb;1"; // ;1 表示第一個過載
// 設定參數
FrmDM->ADOStoredProc1->Parameters->ParamByName("@database")->Value = "db_name_to_backup";
FrmDM->ADOStoredProc1->Parameters->ParamByName("@directory")->Value = path + "db_name_to_backup" + d;
// 執行備份
FrmDM->ADOStoredProc1->ExecProc();
Application->MessageBox("備份完成", "提示", MB_OK + MB_ICONINFORMATION);
this->Close();
}
catch(...) {
Application->MessageBox("備份出錯,請重新再來", "警告", MB_OK + MB_ICONWARNING);
return;
}
| 元件/屬性 | 說明 |
|---|---|
| ADOConnection_Master | 連接 master 資料庫的 ADO 連線元件 |
| ADOStoredProc1.Prepared = true | 預先編譯預存程序,提升重複執行效能 |
| ProcedureName = "backupdb;1" | 指定預存程序名稱,;1 為過載編號 |
| ParamByName 設定參數 | 使用具名參數綁定,避免順序錯誤 |
| ExecProc() | 執行不傳回結果集的預存程序 |
| GetServerTime() | 取得伺服器端時間 (需另行實作),確保檔名時間一致性 |
BACKUP DATABASE 權限 (通常需 db_backupoperator 或 sysadmin 角色)backup 子目錄WITH COMPRESSION)RESTORE VERIFYONLY)