• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
在用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;
    }





鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap