该功能主要还是调用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 的早期版本中还原两个方法就写完了,怎么样,备份与还原数据库还是挺简单的吧。&