Asp.net还原数据库失败的解决方法

在用Asp.net对备份的数据库文件进行还原的时候,有时候会出现下面的错误异常:
[因为数据库正在使用,所以未能获得对数据库的排它访问权。 RESTORE DATABASE 操作异常终止。已将数据库上下文改为 'master'。]
这个时候,自由等待其他进程释放对应权限后,才可还原成功!有没有解决办法呢?我参照【Java】对这个问题的解决方法,做了更新,问题解决。
[SQL代码]
--还原数据库时数据库正在使用导致数据库无会还原,此存储过存在msater数据库下创建。exec killspid 'dbname' 结束此数据库的进程,这样才能还原数据库
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 

[C#代码]
05095105_CfpZ.gif    /// <summary>
05095105_CfpZ.gif    /// 恢复数据库,可选择是否可以强制还原(即在其他人在用的时候,依然可以还原)
05095105_CfpZ.gif    /// </summary>
05095105_CfpZ.gif    /// <param name="databasename">待还原的数据库名称</param>
05095105_CfpZ.gif    /// <param name="databasefile">带还原的备份文件的完全路径</param>
05095105_CfpZ.gif    /// <param name="errormessage">恢复数据库失败的信息</param>
05095105_CfpZ.gif    /// <param name="forceRestore">是否强制还原(恢复),如果为TRUE,则exec killspid '数据库名' 结束此数据库的进程,这样才能还原数据库</param>
05095105_CfpZ.gif    /// <returns></returns>
05095105_CfpZ.gif    public bool RestoreDataBase(string databasename, string databasefile, ref string errormessage,bool forceRestore)
05095105_CfpZ.gif     {
05095105_CfpZ.gif         bool success = true;
05095105_CfpZ.gif         string path = databasefile;
05095105_CfpZ.gif         string dbname = databasename;
05095105_CfpZ.gif
05095105_CfpZ.gif         string restoreSql = "use master;";
05095105_CfpZ.gif
05095105_CfpZ.gif        if (forceRestore)//如果强制回复
05095105_CfpZ.gif             restoreSql += string.Format("use master exec killspid '{0}';",databasename);
05095105_CfpZ.gif
05095105_CfpZ.gif         restoreSql += "restore database @dbname from disk = @path;";
05095105_CfpZ.gif
05095105_CfpZ.gif         SqlCommand myCommand = new SqlCommand(restoreSql, conn);
05095105_CfpZ.gif
05095105_CfpZ.gif         myCommand.Parameters.Add("@dbname", SqlDbType.Char);
05095105_CfpZ.gif         myCommand.Parameters["@dbname"].Value = dbname;
05095105_CfpZ.gif         myCommand.Parameters.Add("@path", SqlDbType.Char);
05095105_CfpZ.gif         myCommand.Parameters["@path"].Value = path;
05095105_CfpZ.gif
05095105_CfpZ.gif         try
05095105_CfpZ.gif         {
05095105_CfpZ.gif             myCommand.Connection.Open();
05095105_CfpZ.gif             myCommand.ExecuteNonQuery();
05095105_CfpZ.gif         }
05095105_CfpZ.gif         catch (Exception ex)
05095105_CfpZ.gif         {
05095105_CfpZ.gif             errormessage = ex.Message;
05095105_CfpZ.gif             success = false;
05095105_CfpZ.gif         }
05095105_CfpZ.gif         finally
05095105_CfpZ.gif         {
05095105_CfpZ.gif             myCommand.Connection.Close();
05095105_CfpZ.gif         }
05095105_CfpZ.gif
05095105_CfpZ.gif        return success;
05095105_CfpZ.gif     }

转载于:https://my.oschina.net/guanxinsui/blog/914441

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值