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

mac2022-06-30  61

在用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)