在asp.net中備份與還原sqlserver數據庫

該功能主要還是調用sqlserver中的backup與restore來完成sqlserver數據庫的還原與備份,小編將兩個功能分別寫成兩個方法,各位在程序中直接調用即可。

一,備份數據庫
/// <summary >
/// 備份數據庫
/// </summary >
/// <param name="databasename" >數據庫名稱</param >
/// <param name="filepath" >備份地址</param >
/// <param name="istype" >1 完整數據庫 2僅備份日誌</param >
public static void BackUp(string databasename, string filepath, string backupname, byte istype, bool isFormat)
{
    StringBuilder sql = new StringBuilder();
    switch (istype)
    {
        case 1:
            sql.Append("backup database " + databasename + " to disk=N'" + filepath + "' with STATS = 10");
            break;
        case 2:
            sql.Append("backup log " + databasename + " to disk=N'" + filepath + "' with STATS = 10");
            break;
        case 3:
            sql.Append("backup database " + databasename + " to disk=N'" + filepath + "' with differential, STATS = 10");
            break;
        default: break;
    }

    sql.Append(", name=N'" + backupname + "'");
    if (isFormat)
        sql.Append(",format");

    using (SqlConnection conn = SqlConn())
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandText = sql.ToString();
            cmd.CommandType = CommandType.Text;

            cmd.ExecuteNonQuery();
        }
    }
}


上面代碼中的C#代碼就不用解釋了,都是一些對sql server最基礎的操作,解釋一下sql:
backup database '要備份的數據庫名稱'--備份指定的數據庫
to disk--備份文件存放的位置
stats--備份完成指定的百分比後就返回一條消息,比如這裏stats=10就是當備份完成10%就返回一條消息,這個也是默認值,如果我們不設置stats,默認就是10.
differential--僅備份與上次完整備份有差異的部分,也就是備份差異數據庫,默認情況下是備份完整數據庫
format--是否格式化備份介質,如果設置該項,則備份文件會格式化選中的備份文件,否則會在選中的備份文件上累加。
backup log '要備份的數據庫名稱'--備份指定數據庫日誌文件

二、還原數據庫
/// <summary >
/// 還原數據庫
/// </summary >
/// <param name="databasename" >數據庫名稱</param >
/// <param name="filepath" ></param >
public static void ReStore(string databasename, string filepath)
{
    try
    {
        string sql = @"use master
            declare @dbname varchar(50)
            set @dbname='" + databasename + "'";

        sql = string.Concat(sql, @"declare @sql varchar(50)
            declare cs_result cursor local for select 'kill '+cast(spid as varchar(50)) from sys.sysprocesses 
                where db_name(dbid)=@dbname 

            open cs_result
            fetch next from cs_result into @sql
            while @@fetch_status=0
            begin
                execute(@sql)
                fetch next from cs_result into @sql
            end
            close cs_result
            deallocate cs_result
            ");
        sql = string.Concat(sql, @" restore database " + databasename + " from disk='" + filepath + "' with replace");

        using (SqlConnection conn = SqlConn())
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = conn;
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;

                cmd.ExecuteNonQuery();
            }
        }
    }
    catch (SqlException ex)
    {
        throw ex;
    }
}


解釋一下上面的sql:
declare @sql varchar(50)
declare cs_result cursor local for select 'kill '+cast(spid as varchar(50)) from sys.sysprocesses  where db_name(dbid)=@dbname 

open cs_result
fetch next from cs_result into @sql
while @@fetch_status=0
begin
      execute(@sql)
      fetch next from cs_result into @sql
end
close cs_result
deallocate cs_result
該段sql是中止所有正在使用要還原數據庫的進程,因爲還原數據庫要求對該數據庫擁有獨佔權限。

restore database '要還原的數據庫名稱'--還原數據庫
from disk--備份文件的地址
replace--是否覆蓋原有數據庫,這個選項與我們在SQL Server Management Studio中還原數據的"覆蓋現有數據庫"選項功能一樣。

注意:由 SQL Server 的較新版本創建的備份將無法在 SQL Server 的早期版本中還原

兩個方法就寫完了,怎麼樣,備份與還原數據庫還是挺簡單的吧。
發佈了93 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章