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