procedure TForm1.Button1Click(Sender: TObject); begin with AdoCommand1 do begin CommandText:='use Master'; Execute; CommandText:='execute KillSPID';--自己写的存储过程 Execute ; CommandText:='Restore database Test From disk='''+'E:\123'+''' with replace'; Execute ; CommandText:='Use Test '; Execute ; end;end; ****************************存储过程KILLSPID--该过程放在Master中Create Proc KillSPID As DECLARE ProcessID CURSOR FOR Select Spid From Master..SysProcesses Where Dbid=db_id('Test') OPEN ProcessID DECLARE @Spid sysname FETCH NEXT FROM ProcessID INTO @Spid WHILE (@@FETCH_STATUS <> -1) BEGIN EXEC ('Kill ' + @Spid) FETCH NEXT FROM ProcessID INTO @Spid END CLOSE ProcessID DEALLOCATE ProcessID 还原数据库时注意事项 1.恢复时一定会连接Master数据库 2.用应用程序恢复时,需要用KILLSPID来杀死连接在该数据库上的进程 3.KILLSPID一定在放在Master数据库中,否则会出现'不能用 KILL 来取消您自己的进程。'
桌面级数据库(如access),直接Copy文件到可以了
像ms sqlserver,可以使用restore database 这个sql语句;
这样应该就取消了与数据库之间的连接嘛,但是还是不行,返回的是:
因为数据库正在使用,所以未能获得对数据库的排它访问权。
begin
with AdoCommand1 do
begin
CommandText:='use Master';
Execute;
CommandText:='execute KillSPID';--自己写的存储过程
Execute ;
CommandText:='Restore database Test From disk='''+'E:\123'+''' with replace';
Execute ;
CommandText:='Use Test ';
Execute ;
end;end; ****************************存储过程KILLSPID--该过程放在Master中Create Proc KillSPID
As
DECLARE ProcessID CURSOR
FOR
Select Spid From Master..SysProcesses Where Dbid=db_id('Test')
OPEN ProcessID
DECLARE @Spid sysname
FETCH NEXT FROM ProcessID INTO @Spid
WHILE (@@FETCH_STATUS <> -1)
BEGIN EXEC ('Kill ' + @Spid)
FETCH NEXT FROM ProcessID INTO @Spid
END
CLOSE ProcessID
DEALLOCATE ProcessID 还原数据库时注意事项
1.恢复时一定会连接Master数据库
2.用应用程序恢复时,需要用KILLSPID来杀死连接在该数据库上的进程
3.KILLSPID一定在放在Master数据库中,否则会出现'不能用 KILL 来取消您自己的进程。'
请高手分析一下,,,,,