本範例封裝於獨立類別,提供 BackupDatabase 與 RestoreDatabase 兩個靜態方法,供 UI 或排程呼叫。
/**********************************************************************************
* 功能:備份/還原 SQL Server 資料庫
* 作者:劉功勳
* 版本:V0.1 (C# 2.0)
**********************************************************************************/
using System;
using System.Data.SqlClient;
using System.IO;
public class SqlBackupHelper
{
///
/// 完整備份資料庫至 .bak 檔案
///
public static bool BackupDatabase(string connectionString, string dbName, string backupFolder, out string errMsg)
{
errMsg = "";
try
{
string fileName = $"{dbName}_{DateTime.Now:yyyyMMdd_HHmmss}.bak";
string fullPath = Path.Combine(backupFolder, fileName);
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
string sql = $@"BACKUP DATABASE [{dbName}] TO DISK = N'{fullPath}'
WITH NOFORMAT, NOINIT, NAME = N'{dbName}-Full Backup',
SKIP, NOREWIND, NOUNLOAD, STATS = 10";
using (var cmd = new SqlCommand(sql, conn))
{
cmd.CommandTimeout = 3600;
cmd.ExecuteNonQuery();
}
}
return true;
}
catch (Exception ex)
{
errMsg = ex.Message;
return false;
}
}
///
/// 從 .bak 檔案還原資料庫(覆蓋模式)
///
public static bool RestoreDatabase(string connectionString, string dbName, string bakFilePath, out string errMsg)
{
errMsg = "";
try
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
// 先設定單一使用者模式強制中斷現有連線
string sql = $@"ALTER DATABASE [{dbName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [{dbName}] FROM DISK = N'{bakFilePath}'
WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10;
ALTER DATABASE [{dbName}] SET MULTI_USER;";
using (var cmd = new SqlCommand(sql, conn))
{
cmd.CommandTimeout = 3600;
cmd.ExecuteNonQuery();
}
}
return true;
}
catch (Exception ex)
{
errMsg = ex.Message;
return false;
}
}
}
string connStr = "Server=.;Database=master;Integrated Security=True;";
string db = "MyAppDB";
string folder = @"D:\DB_Backups";
if (SqlBackupHelper.BackupDatabase(connStr, db, folder, out string err))
Console.WriteLine("備份成功");
else
Console.WriteLine("失敗:" + err);
db_backupoperator / db_owner 或 sysadmin 權限。WITH COMPRESSION 並調整 MAXTRANSFERSIZE、BLOCKSIZE。