再审后还能申诉吗:我用VB写了一个系统,有恢复数据库的功能,现在的问题是备份数据库没问题,就无法恢复数据库

来源:百度文库 编辑:高校问答 时间:2024/05/06 18:18:17
我用VB写了一个系统,有备份和恢复数据库的功能,现在的问题是备份数据库没问题,但只要进系统后调用了一次ADODC控件,就无法恢复数据库了,提示“实时错误‘-2147217900 (80040e14)’:[Microsoft][ODBC SQL Server Driver][SQL Server]因为数据库正在使用,所以未能获得对数据库的排它访问权”

后来经多次调试,发现只要涉及到ADODC控件,就无法使用恢复数据库的功能,反而在没有使用ADODC,用手工连接数据库的情况下就没有这个问题,自己大概分析后怀疑ADODC控件的属性没设置好,导致其一直在占用着数据库,使得恢复数据库时无法“写”进数据库里,各位XDJM帮帮在下吧?这个问题不解决睡不着觉啊~~~

PS:以下是备份和恢复数据库的部分代码
................
Private Sub CmdBackup_Click()
Dim S
’选择备份数据库按钮时
If Option1.Value = True Then
S = Dir1.Path & "\" & Date & ".BAK"
If Label1.Caption = S Then
MsgBox "数据备份卡已存在!", vbExclamation, "提示"
Else
StrCnn.Open "Provider=MSDASQL.1;Persist Security Info=False;User ID=ss;Data Source=Backup"
sql = "backup DATABASE computer TO disk='" & S & "'"
StrCnn.Execute (sql)
StrCnn.Close
MsgBox "数据库备份成功!", vbExclamation, "提示"
key = Date & ".BAK"
Set itmX = ListView1.ListItems.Add(, , key, 1)
End If
End If
’选择恢复数据库按钮时
If Option2.Value = True Then
If File1.ListCount <> 0 Then
If Label1.Caption <> "" Then
StrCnn.Open "Provider=MSDASQL.1;Persist Security Info=False;User ID=ss;Data Source=Backup"
'出错就在以下这一行
sql = "RESTORE DATABASE computer from disk='" & Label1.Caption & "'"
StrCnn.Execute (sql)
StrCnn.Close
MsgBox "数据库恢复成功!", vbExclamation, "提示"
Else
MsgBox "请选择要恢复的数据备份卡!", vbExclamation, "提示"
End If
Else
MsgBox "请选择要恢复的数据备份卡!", vbExclamation, "提示"
End If
End If
End Sub
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