/// <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,可以把原码发给你测试。
/// 恢复指定的数据库
/// </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,可以把原码发给你测试。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货