我用VB写了一个系统,有恢复数据库的功能,现在的问题是备份数据库没问题,就无法恢复数据库

2024-12-26 20:43:35
推荐回答(1个)
回答1:

你的连接字符串里边没有指定要连接的数据库,而账户ss对应的默认数据库可能是computer,如果是这样的话,一旦建立连接,就会连接默认的数据库computer,造成在备份的时候不能获得排他访问权。
你在连接字符串中指定要连接的数据库为master或其它数据库。

StrCnn.Open "Provider=MSDASQL.1;Persist Security Info=False;User ID=ss;Data Source=Backup;DATABASE=master"

---------------------
还是不行的原因应该是帐户ss或其它帐户已经连接到了computer数据库了。可能是之前你进行别的操作,而连接还没有断开。
所以你最好是在重新启动SQL SERVER 服务以后进行还原。

其实SQL SERVER中恢复过程中遇到数据库不能获得独占权是经常遇到的问题。要想解决,就得把连接到要恢复的数据库的进程全部kill掉。Kill进程之前,要保证你当前连接没有访问那个数据库,一般按我上边说的方法就可以。

至于KILL掉进程的方法需要用存储过程。简单的写了个存储过程,你看一下。最好把存储过程放在master数据库。在恢复数据库之前执行一下
exec killproc 'computer'
不知道你能不能理解。如果你不是专门做数据库的,可能比较麻烦吧。

create procedure killproc
--alter procedure killproc
@dbname varchar(100)
as

if not exists(select * from master.dbo.sysdatabases where name=@dbname )
begin
raiserror('数据库名称无效',1,1)
return
end

declare @sqlstr varchar(3000)
declare @spid int

if exists(select * from master.dbo.syscursors where cursor_name='cur_proc')
begin
deallocate cur_proc
end

declare cur_proc cursor
for select spid
from master.dbo.sysprocesses
where dbid=db_id(@dbname)

open cur_proc

fetch next from cur_proc
into @spid

while @@fetch_status=0
begin
set @sqlstr='kill '+cast(@spid as varchar(10))
exec (@sqlstr)
fetch next from cur_proc
into @spid
end

close cur_proc
deallocate cur_proc