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#代码]
     ///   < summary >
    
///  恢复数据库,可选择是否可以强制还原(即在其他人在用的时候,依然可以还原)
    
///   </ summary >
    
///   < param name = "databasename" > 待还原的数据库名称 </ param >
    
///   < param name = "databasefile" > 带还原的备份文件的完全路径 </ param >
    
///   < param name = "errormessage" > 恢复数据库失败的信息 </ param >
    
///   < param name = "forceRestore" > 是否强制还原(恢复),如果为TRUE,则exec killspid  ' 数据库名 '  结束此数据库的进程,这样才能还原数据库 </ param >
    
///   < returns ></ returns >
    
public  bool RestoreDataBase(string databasename, string databasefile, ref string errormessage,bool forceRestore)
    {
        bool success 
=  true;
        string path 
=  databasefile;
        string dbname 
=  databasename;

        string restoreSql 
=  " use  master;";

        
if  (forceRestore) // 如果强制回复
            restoreSql 
+=  string.Format(" use  master  exec  killspid  ' {0} ' ;",databasename);

        restoreSql 
+=  " restore   database   @dbname   from   disk   =   @path ;";

        SqlCommand myCommand 
=  new SqlCommand(restoreSql, conn);

        myCommand.Parameters.
Add (" @dbname ", SqlDbType. Char );
        myCommand.Parameters
[ "@dbname" ] .Value  =  dbname;
        myCommand.Parameters.
Add (" @path ", SqlDbType. Char );
        myCommand.Parameters
[ "@path" ] .Value  =  path;

        try
        {
            myCommand.Connection.
Open ();
            myCommand.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            errormessage 
=  ex.Message;
            success 
=  false;
        }
        finally
        {
            myCommand.Connection.
Close ();
        }

        
return  success;
    }




转载于:https://www.cnblogs.com/windthunder/archive/2009/09/25/1573981.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值