System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权。 (Microsoft.SqlServer.Smo)
1. 比较直接的重启下Sql Server服务即可,此方案适合在普通个人电脑,或者电脑上只有这一个重要数据库的情况使用;
2.如果该数据库是服务器,上面有很多重要的数据库,不可能因为一个数据库把所有数据库的连接都断掉,可采用下面方案
在master数据库创建下面存储过程,作用:清除所有使用该数据库的会话;
USE master
GO
CREATE PROC [dbo].[sp_ClearDbConnections]
@DbName VARCHAR(30)
AS
--清除某个数据库的所有数据库连接
DECLARE @SPID INT
DECLARE @SqlForClear NVARCHAR(100)
DECLARE curID CURSOR FORWARD_ONLY READ_ONLY FOR (
SELECT SPID
FROM Master.dbo.SysProcesses
WHERE DB_Name(DBID) = @DbName)
OPEN curID
FETCH NEXT FROM curID INTO @SPID
WHILE @@Fetch_Status = 0
BEGIN
SET @SqlForClear = N'KILL ' + Cast(@SPID AS NVARCHAR(10))
EXEC sp_ExecuteSql @SqlForClear
IF @@Error = 0
PRINT '已清除连接:' + Cast(@SPID AS VARCHAR(10))
FETCH NEXT FROM curID INTO @SPID
END
CLOSE curID
DEALLOCATE curID
PRINT '对数据库“' + @DbName + '”的连接清除操作完毕'
GO
之后执行该存储过程,清除使用该数据库的所有连接,再次还原(操作间隙时间要尽量短,避免在这个间隙又有连接进来);
exec sp_ClearDbConnections '要还原的数据库名称'