请教高手:在SERVER端执行数据库恢复操作时,CLIENT端出现”连接失败“提示。

duola1 2003-09-11 04:33:25
SERVER端程序语句如下:
user master
exec killspid 'aa'
restore database aa from disk='c:\aa.bak' with replace
use aa
当以上语句执行后,CLIENT端对数据库aa操作时,会出现”连接失败”的提示。CLIENT程序只能中止后重新运行才能对数据库aa操作。
CLIENT端是用DELPHI开发的,用ADO控件连接数据库。
我想将系统出现的”连接失败”的提示改掉,也就是要实现当SERVER端执行数据库恢复操作时,CLIENT端若要对数据库操作,则出现“数据库连接失败!”的提示并自动中止CLIENT端运行。
请教高手:要如何实现以上功能?
附killspid存储过程的语句如下:
create proc killspid (@dbname varchar(20))
as
begin
declare @sql nvarchar(500)
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
declare @a varchar(100)
while @@fetch_status < >-1
begin
set @a='kill '+rtrim(@spid)
exec(@a)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end
...全文
51 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
leimin 2003-09-14
  • 打赏
  • 举报
回复
你可以通过下面的SP,来返回数据库的状态。当@RC=-2时,你就可以提示一个信息给CLIENT.
create proc usp_CheckDBStatus
@chr_dbname sysname
as

SET NOCOUNT ON

/******************************************************************/
/* initialization */
/******************************************************************/
Declare @rc int
Declare @Status int
Declare @output varchar(255)

select @rc=0
select @Status=0
select @output=''

if @chr_dbname is null
begin
select @rc=-1
return @rc
end

/******************************************************************/
/* Get STATUS from MASTER..SYSDATABASES */
/******************************************************************/
if @rc=0
begin
select @status=status&192 from master..sysdatabases
where [name]=@chr_dbname

if @status=192
begin
select @rc=-2
print @chr_dbname +'status is pre recovery or recovering'
end
else
begin
print @chr_dbname +'status is not in pre recovery or recovering'
end
end
duola1 2003-09-13
  • 打赏
  • 举报
回复
真的没有办法了吗?
arrow_gx 2003-09-12
  • 打赏
  • 举报
回复
数据恢复的时候是不允许客户端访问的,这个问题没有任何办法解决
duola1 2003-09-11
  • 打赏
  • 举报
回复
我把我的程序帖出来,给各位高手看看,要如何修改?
SERVER端程序代码如下:
begin
if DM_s.ADOConnection1.Connected then
begin
with DM_s.ADOQuery9 do
begin
close;
sql.Clear;
sql.Add('use master');
prepared;
execsql;
close;
sql.Clear;
sql.Add('exec killspid ''aa''');
prepared;
execsql;
close;
sql.Clear;
sql.Add('restore database aa from disk='c:\aa.bak' with replace');
prepared;
try
execsql;
showmessage('恢复系统数据库成功!');
except
showmessage('恢复系统数据库出错!');
end;
close;
sql.Clear;
sql.Add('use aa');
prepared;
execsql;
end;
end
else
begin
showmessage('数据库连接失败!');
Application.Terminate;
end;
end;
CLIENT端程序代码如下:
BUTTON双击事件:
begin
if DM.ADOConnection1.Connected then
begin
with DM.ADOQuery1 do
begin
Close;
sql.Clear;
sql.Add('select * from User order by UserName');
prepared:=true;
Open;
end;
end
else
begin
showmessage('数据库连接失败!');
Application.Terminate;
end;
end;
当SERVER端和CLIENT端程序都在运行时,SERVER执行数据恢复操作后,在CLIENT端双击BUTTON出现“连接失败”的提示。
duola1 2003-09-11
  • 打赏
  • 举报
回复
up
duola1 2003-09-11
  • 打赏
  • 举报
回复
可是若不用exec killspid 'aa'的话,不能执行restore语句。
g8341 2003-09-11
  • 打赏
  • 举报
回复
你用ADO,创建连接,要保证此连接上不能有其他连接,
再说,强制中断,可能会造成数据丢失,还是去掉,exec killspid 'aa' 比较好,
duola1 2003-09-11
  • 打赏
  • 举报
回复
SERVER端的语句已经是:
user master
exec killspid 'aa'
restore database aa from disk='c:\aa.bak' with replace
use aa
还是不行呀
pengdali 2003-09-11
  • 打赏
  • 举报
回复
use master
go
exec killspid 'aa'
go
restore database aa from disk='c:\aa.bak' with replace
go
use aa
yelook 2003-09-11
  • 打赏
  • 举报
回复
up
arrow_gx 2003-09-11
  • 打赏
  • 举报
回复
数据库的恢复必须中断所有客户端对该数据库的访问、连接,出现中断是正常的阿

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧