畢業專題需實作資料庫備份/還原網頁。還原時常遇到 「資料庫正在使用中,無法取得排他存取權」 錯誤(排他性鎖定衝突)。
還原前先執行:
ALTER DATABASE [DbName] SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [DbName] SET ONLINE;
ROLLBACK IMMEDIATE 立即回滾未完成交易並斷開所有連線,確保還原時資料庫處於無連線狀態。
void RestoreButton_Click(object sender, EventArgs e)
{
string path = PathTextBox.Text;
string dbName = DbDropDownList.SelectedValue;
string offlineSql = "USE master; ALTER DATABASE [" + dbName + "] SET OFFLINE WITH ROLLBACK IMMEDIATE; ALTER DATABASE [" + dbName + "] SET ONLINE;";
string restoreSql = "USE master; RESTORE DATABASE [" + dbName + "] FROM DISK = @path WITH REPLACE;";
using (SqlConnection conn = new SqlConnection(ConnStr))
{
// 1. 強制離線/上線斷開連線
SqlCommand offlineCmd = new SqlCommand(offlineSql, conn);
conn.Open();
offlineCmd.ExecuteNonQuery();
conn.Close();
// 2. 執行還原(參數化防注入)
SqlCommand restoreCmd = new SqlCommand(restoreSql, new SqlConnection(ConnStr));
restoreCmd.Parameters.Add("@path", SqlDbType.NVarChar).Value = path;
try
{
restoreCmd.Connection.Open();
restoreCmd.ExecuteNonQuery();
InfoLabel.Text = "還原成功!已將備份 " + path + " 還原至資料庫 " + dbName;
}
catch (Exception ex)
{
InfoLabel.Text = "還原失敗!錯誤:" + ex.ToString();
}
finally
{
restoreCmd.Connection.Close();
}
}
}
WITH REPLACE 選項允許覆蓋現有資料庫。master 資料庫,避免目標資料庫自身連線干擾。