sql数据库还原问题,高手救命啊。
我用很多人都介绍的方法,在数据中建立killspid存储过程,以强行杀掉数据库当前所的使用进程
然后
在代码中调用killspid存储过程!
use master
go
create proc killspid (@dbname varchar(20))
as
begin
declare @sql nvarchar(500),@temp varchar(1000)
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 =0
begin
set @temp='kill '+rtrim(@spid)
exec(@temp)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end
以上的存储过程我放在master数据库上.
然后我在查询分析器上输入
use master
exec killspid '数据库名' //这里的数据库名我输入的是要还原的数据库名称,假设是student,查询分析器也提示编译通过了.
然后我在程序中是这样调用上面的存储过程的:
Dim sConnectionString As String = _
"data source=localhost;initial catalog=master;integrated security=SSPI;persist security info=False;workstation id=XIER-7Y049H16BQ;packet size=4096"
Dim sqlConn As New SqlConnection(sConnectionString)
Dim myCmd As New SqlCommand()
With myCmd
.Connection = sqlConn
.CommandText = "killspid"
.CommandType = CommandType.StoredProcedure
End With
Dim prmSql As SqlParameter = myCmd.Parameters.Add("@dbname", "student")
prmSql.Direction = ParameterDirection.Input
sqlConn.Open()
myCmd.ExecuteNonQuery()
sqlConn.Close()
然后是执行还原的语句:
Dim sqldmo As New SQLDMO.SQLServer()
sqldmo.LoginTimeout = 15
sqldmo.Connect("(local)", "sa", "")
Dim sqlrestore As New SQLDMO.Restore()
sqlrestore.Action = 0
sqlrestore.Database = "student"
sqlrestore.Files = "d:\test.bak"
sqlrestore.ReplaceDatabase = True
sqlrestore.SQLRestore(sqldmo)
上面的代码我是放在同一个button事件中的,但是如果其他程序连接到同一个数据库的时候,我执行上面的过程,还是一直会出现"当前数据库正在使用,你不能获得排它访问权",大家帮帮忙,认真的帮我检查一下可能哪里错了.