加载中…
个人资料
草泥马
草泥马
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,180
  • 关注人气:10
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

RESTORE DATABASE 操作异常终止(转)

(2011-11-18 12:26:11)
标签:

杂谈

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有