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

来源:百度知道 编辑:UC知道 时间:2024/07/07 06:08:33
我用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, "提示"

你的连接字符串里边没有指定要连接的数据库,而账户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 in