为什么用ADO边接恢复SQL SERVER数据库老出错啊?(100分)

  • 主题发起人 主题发起人 诸葛白痴
  • 开始时间 开始时间
咦?!! 唉!!!?耽误大家了, 我看了一下我原来的程序, 并没有特意去解决
这个问题, 采用的办法是在应用程序中进行通知的办法, 其它用户程序收到通知
便自动退出, 这显然不是理想的办法, 请大家原谅.
最近丈母娘住院手术, 单位事情又多, 我会尽力抽时间来解决这个问题的
再次请大家谅解.
 
这样啊,我的方法就是sp_who和kill,前面出错是因为我的程序只使用了一个ADOConnection,
将它与原先的业务数据库断开,再连上master,再sp_who、kill,再restore,最后再连接上
业务数据库,结果出现了上面的错误,实际上,避免错误的方法很简单,create一个新的
ADOConnection,连接上master,用这个ADOConnection去kill和restore,完成后,在将原先
的ADOConnection连接上业务数据库,什么问题都没有,代码和我上面贴的差不多,只是新建
一个ADOConnection,做完后Free掉,就ok!
诸葛白痴(呵呵呵,好像骂你一样),你说的“不能杀死自己的进程”的情况可能是你kill
的进程是master的进程,kill master的进程才会出现这样错误,我的程序中:
ADOQ_1.Filter :='dbname=''数据库名''';
ADOQ_1.Filtered :=true;
就是将需要kill连接的数据库名上的进程过滤出来,这个方法绝对不会错,我现在已经只用自
己做的程序来做备份、恢复的操作了,很好用,不出错!
 
我也正在做,還沒做出來.只好聽課.
 
继续 Wait Best
 
to everyone: 问题基本解决,但对MS的此解决方案深感不解,不过小弟还想多问一个连
发问题:用exec sp_who的返回集能不能用这样的语句来做select * from (exec sp_who)
where dbname = 'databasename',如果不行,那要从存储过程中返回一定的数据集怎样做
比如将返回的数据集放入一个临时表怎样做呢,exec sp_who into #temp1???
 
>用exec sp_who的返回集能不能用这样的语句来做select * from (exec sp_who)
>where dbname = 'databasename'
你问这个问题到不如自己去尝试一下,答案出来得更快,我没去试,估计是不行的,因为
存储过程不会返回一个recordset的,系统提供sp_who是方便你使用的,你如果要改进,直
接看它的代码不就行了?

sp_helptext sp_who

Text
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
create procedure sp_who --- 1995/11/28 15:48
@loginame sysname = NULL --or 'active'
as

declare @spidlow int,
@spidhigh int,
@spid int,
@sid varbinary(85)

select @spidlow = 0
,@spidhigh = 32767


if ( @loginame is not NULL
AND upper(@loginame) = 'ACTIVE'
)
begin

select spid ,status
,loginame=rtrim(loginame)
,hostname ,blk=convert(char(5),blocked)
,dbname= db_name(dbid),cmd
from master.dbo.sysprocesses
where spid >= @spidlow and spid <= @spidhigh AND
upper(cmd) <> 'AWAITING COMMAND'

return (0)
end

if (@loginame is not NULL
AND upper(@loginame) <> 'ACTIVE'
)
begin
if (@loginame like '[0-9]%') -- is a spid.
begin
select @spid = convert(int, @loginame)
select spid, status,
loginame=rtrim(loginame),
hostname,blk = convert(char(5),blocked),
dbname=db_name(dbid),
cmd
from master.dbo.sysprocesses
where spid = @spid
end
else
begin
select @sid = suser_sid(@loginame)
if (@sid is null)
begin
raiserror(15007,-1,-1,@loginame)
return (1)
end
select spid, status,
loginame=rtrim(loginame),
hostname ,blk=convert(char(5),blocked),
dbname=db_name(dbid),
cmd
from master.dbo.sysprocesses
where sid = @sid
end
return (0)
end


/* loginame arg is null */
select spid,
status,
loginame=rtrim(loginame),
hostname,
blk=convert(char(5),blocked),
dbname=db_name(dbid),
cmd
from master.dbo.sysprocesses
where spid >= @spidlow and spid <= @spidhigh


return (0) -- sp_who

看明白了吗?进程信息就在master.sysprocesses表中,简化一下就是:
select spid,
status,
loginame=rtrim(loginame),
hostname,
blk=convert(char(5),blocked),
dbname=db_name(dbid),
cmd
from master.dbo.sysprocesses
where spid >= 0 and spid <= 32767 and db_name(dbid)='你要的数据库'

自己看着办吧!
 
to dirk:我只是用一个例子而已,比如说不是这个存储过程,难道全部要从其代码里面
去看吗?我记得以前看到过关于从存储过程里筛选数据的写法,只是忘了,如果不知道也
就算了,也同样感谢!
 
有“从存储过程里筛选数据”的方法吗?你说的不会是用游标吧?要知道,有些存储过程
中打开不止一个recordset,用ADO的话也只能通过NextRecordset方法去获得,对于这样的
的存储过程,怎么筛选?难道还要指定筛选哪一个recordset(大多数存储过程中都会有不
止一个的select)?有“从存储过程里筛选数据”的这么好的方法居然也会忘了[:(],想起
来的话贴出来,让我也学习学习![:)]
 
to dirk:没错,一个存储过程可能有n个recordset,但在存储返回只是最后一个啊,
不信你试试
 
这种情况是返回最后一个recordset:
declare @aa int
select @aa='123'
select * from MyTable
如果这样,首先返回的是第一个recordset:
select '123'
select * from MyTable
第二个recordset是通过NextRecordset方法去访问的,你把这两句放到TADOQuery的SQL
中,再将TADOQuery与一个TDBGrid关联,打开,首先看到的肯定是 ‘123’,用TADOStoredProc
也是一样。

既然第二种情况是合法的,那“从存储过程里筛选数据”的方法肯定不能忽略这种情况,
那么是要指定筛选哪一个recordset吗?我觉得不太可能。

请参考。
 
to dirk: 谢谢,我在研究研究
 

Similar threads

后退
顶部