/// <summary>
    /// 恢复指定的数据库
    /// </summary>
    /// <param name="sender">事件源</param>
    /// <param name="e">发生事件的信息</param>
    protected void btnRestore_Click(object sender, EventArgs e)
    {
        string strConnectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString();/
        string strSourcePath = ConfigurationManager.AppSettings["DataBasePath"].ToString();//存放备份文件的目录名
        strSourcePath = Server.MapPath(strSourcePath);//备份文件的物理目录路径
        string strTargetDataBaseName = "equipmentend";//恢复后的数据库名
        string strSourceDataBaseName = ddlRestoreFile.SelectedValue.ToString();//备份文件的的文件名
        string strSql = "use master;";
        strSql += "restore database @dbname from disk = @dbpath ";
        strSql += " with move 'Equipmentend_Data' to '";
        strSql += Server.MapPath(@"App_Data\equipmentend_Data.MDF") + "',";
        strSql += " move 'equipmentend_log' to '";
        strSql += Server.MapPath(@"App_Data\equipmentend_Log.LDF") + "'";//恢复数据库的sql语句 
        KillDataBase(strTargetDataBaseName);
        RestoreDataBase( strConnectionString, strSql, strTargetDataBaseName, strSourcePath, strSourceDataBaseName);
     }
      /// <summary>
    /// 恢复数据库
    /// </summary>
    /// <param name="strconnectionstring">数据库连接字符串</param>
    /// <param name="strsql">恢复数据库SQL命令</param>
    /// <param name="strtargetdatabasename">恢复后的数据库名(sqlserver服务器上运行的数据库名)</param>
    /// <param name="strsourcepath">备份文件的物理目录路径</param>
    /// <param name="strsourcedatabasename">备份的文件名</param>
    private void RestoreDataBase(string strconnectionstring, string strsql, string strtargetdatabasename, string strsourcepath, string strsourcedatabasename)
    {
        try
        {
            SqlConnection sqlConn = new SqlConnection(strconnectionstring);
            using (SqlCommand sqlCmd = new SqlCommand(strsql, sqlConn))
            {
                if (sqlCmd.Connection.State.ToString() == "Closed")
                {
                    sqlCmd.Connection.Open();
                }
                sqlCmd.CommandType = CommandType.Text;
                sqlCmd.Parameters.Add("@dbname", SqlDbType.NVarChar);
                sqlCmd.Parameters["@dbname"].Value = strtargetdatabasename;
                sqlCmd.Parameters.Add("@dbpath", SqlDbType.NVarChar);
                sqlCmd.Parameters["@dbpath"].Value = strsourcepath + "\\" + strsourcedatabasename + ".bak";
                sqlCmd.ExecuteNonQuery();
           }
            labMessage.Text = "数据库恢复成功!!!";
        }
        catch (System.Exception ex)
        {
            labMessage.Text = "数据库恢复失败!!!<br>" + ex.Message.ToString();
        }
    }
    ////杀死sqlserver服务器上的数据库
    ///strdbname sqlserver服务器上的正在运行的数据库
    private void KillDataBase(string strDbName)
    {
        string strConnectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString();
        SqlConnection sqlConn = new SqlConnection(strConnectionString);
        try
        {            using (SqlCommand sqlCmd = new SqlCommand("killspid", sqlConn))
            {
                if ( sqlCmd.Connection.State.ToString() == "Closed" )
                {
                    sqlCmd.Connection.Open();
                }
                sqlCmd.CommandType = CommandType.StoredProcedure;
                sqlCmd.Parameters.Add("@dbname", SqlDbType.NVarChar);
                sqlCmd.Parameters["@dbname"].Direction = ParameterDirection.Input;
                sqlCmd.Parameters["@dbname"].Value = strDbName;
                sqlCmd.ExecuteNonQuery();
                sqlCmd.Dispose();
                sqlConn.Close();
                sqlConn = null;
            }
        }
        catch(System.Exception ex)
        {
            labMessage.Text = "数据库恢复失败!!!<br>" + ex.Message.ToString();
        }
    }
  此例可以正常恢复数据库但是,当单击其他页面联结回报错。
  报错如下:
     在向服务器发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 1 - 执行读/写操作期间检测到 I/O 错误。) 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Exception: 在向服务器发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 1 - 执行读/写操作期间检测到 I/O 错误。)请高手帮忙。有什么办法可以解决。我也试过用SQLDMO来恢复数据库,也回出这样的错误。出现这样的错误是应为调用了KillDataBase(string strDbName)
但是不调用KillDataBase(string strDbName)恢复数据库也会错误,错误理由是数据库正在使用未获取排放权限。以下是KillDataBase(string strDbName)函数所调用的存储过程。
create proc killspid (@dbname varchar(20))
as
begin
declare @sql nvarchar(500)
declare @spid int
set @sql='declare getspid cursor for 
select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
exec (@sql)
open getspid
fetch next from getspid into @spid
while @@fetch_status<>-1
begin
exec('kill '+@spid)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end
GO
该存储过程必修放在master数据库中
在这里先谢了。
如有不明白可以加本人QQ,可以把原码发给你测试。