您的位置:首页 > 编程语言 > ASP

ASP.NET SQLServer2005 数据库备份与还原

2012-09-25 11:37 567 查看
using System;
using System.Data.SqlClient;
using System.Data;
using System.IO;

namespace NET.Common
{
/// <summary>
/// 数据库操作帮助类
/// </summary>
public class DatabaseHelper
{
private const string SQL_DATABASE_BACK = "BACKUP DATABASE {0} TO DISK = '{1}'"; //数据库备份语句
private const string SQL_DATABASE_RESTORE = "RESTORE DATABASE {0} FROM DISK = '{1}' WITH REPLACE"; //数据库还原语句
private const string SQL_SELECT_ALL_CONN = "SELECT spid FROM master..sysprocesses WHERE dbid=db_id('{0}')"; //获取指定数据库所有链接语句

/// <summary>
/// 实例数据库操作
/// </summary>
/// <param name="masterConnectionString">master数据库链接字符串</param>
public DatabaseHelper(string masterConnectionString)
{
this.MasterConnectionString = masterConnectionString;
}

/// <summary>
/// master数据库链接字符串
/// </summary>
private string MasterConnectionString { get; set; }

/// <summary>
/// SQLServer数据库备份
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="backName">备份文件名称,不包含后缀名</param>
/// <param name="path">备份文件存放的物理路径</param>
public bool Back(string dbName, string backName, string path)
{
//判断存放备份文件的目录是否存在
if (!Directory.Exists(path))
{
//不存在,新建目录
Directory.CreateDirectory(path);
}

try
{
using (SqlConnection conn = new SqlConnection(MasterConnectionString))
{
//设置存放备份文件的完整物理路径
string backPath = path + "\\" + backName + ".bak";

//设置数据库备份的T-SQL语句
string t_sql_back = string.Format(SQL_DATABASE_BACK, dbName, backPath);

using (SqlCommand cmd = new SqlCommand(t_sql_back, conn))
{
cmd.CommandType = CommandType.Text;
conn.Open();

//开始备份
cmd.ExecuteNonQuery();

return true;
}
}
}
catch
{
return false;
}
}

/// <summary>
/// SQLServer数据库还原
/// </summary>
/// <param name="dbName">要进行还原的数据库名称</param>
/// <param name="fullPath">备份文件的完整物理路径</param>
public bool Restore(string dbName, string fullPath)
{
//判断还原使用的文件是否存在
if (!File.Exists(fullPath))
{
return false;
}

try
{
using (SqlConnection conn = new SqlConnection(MasterConnectionString))
{
//设置数据库还原的T-SQL语句
string t_sql_restore = string.Format(SQL_DATABASE_RESTORE, dbName, fullPath);

//设置查询指定数据库的所有连接
string t_sql_select_all_conn = string.Format(SQL_SELECT_ALL_CONN, dbName);

string t_sql_kill;

conn.Open();

//获取指定数据库所有连接
SqlCommand cmd = new SqlCommand(t_sql_select_all_conn, conn);
SqlDataAdapter reSDA = new SqlDataAdapter(cmd);
DataTable dtConn = new DataTable();
reSDA.Fill(dtConn);

//逐一删除连接
for (int i = 0; i < dtConn.Rows.Count; i++)
{
t_sql_kill = " kill  " + dtConn.Rows[i][0].ToString();
cmd = new SqlCommand(t_sql_kill, conn);
cmd.ExecuteNonQuery();
}

//执行还原操作
cmd = new SqlCommand(t_sql_restore, conn);
cmd.ExecuteNonQuery();

//清空当前连接池,这个很主要,如果不清空还原后第一次访问会出现“在向服务器发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)”错误
SqlConnection.ClearPool(conn);
return true;
}

}
catch
{
return false;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: