数据库恢复?

cjhchina 2004-11-20 03:08:30
恢复代码是:
ADOCommand1.CommandText:='use master';
ADOCommand1.Execute;
ADOCommand1.CommandText:='RESTORE DATABASE test from disk=''d:\text.bak''';
ADOCommand1.Execute;
ADOCommand1.CommandText:='use test';
ADOCommand1.Execute;
showmessage('ok');

错误:“因为数据库正在使用,所以未能获得对数据库的排它访问权”

必须把每个窗体的ADOConnection的连接给断了才能正常恢复,请问有什么好的方案没?
...全文
131 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wnsr 2004-11-21
  • 打赏
  • 举报
回复
你是不是用企业管理器中打开数据库test了,或者有多个实例在运行,如果仅仅是从程序中恢复数据库,就只能有一个实例在运行,才能恢复。否则只能用下面的方法:
在查询分析器中运行
use master
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_killspid]
GO

create proc p_killspid
@dbname sysname --要关闭进程的数据库名
as
declare @s nvarchar(1000)
declare tb cursor local for
select s='kill '+cast(spid as varchar)
from master..sysprocesses
where dbid=db_id(@dbname)

open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
go

--用法
exec p_killspid test

--恢复数据库.
RESTORE DATABASE test FROM disk='D:\text.bak'

不过这种方法在恢复数据库之后,只有重新启动程序才能使用程序的其它功能。
pdbird 2004-11-21
  • 打赏
  • 举报
回复
procedure TForm23.Button2Click(Sender: TObject);
begin
adoquery1.SQL.Clear;
adoquery1.SQL.Add('use Master');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('execute sp_helpdevice');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('Restore database test From disk=''d:\text.bak'' with replace');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('Use test');
adoquery1.ExecSQL;
application.MessageBox('数据库完成恢复','警告',MB_OK);
end;
这个应当行的。
cjhchina 2004-11-21
  • 打赏
  • 举报
回复
试了,还是原样。
backstreetNewhua 2004-11-20
  • 打赏
  • 举报
回复
没有关闭数据库,你可以连到Master上
zzlazio 2004-11-20
  • 打赏
  • 举报
回复
老问题....
建议发前搜索下撒...
wnsr 2004-11-20
  • 打赏
  • 举报
回复
我上面的方法可以的,不用断开adoconnection的,你没试吗?
cjhchina 2004-11-20
  • 打赏
  • 举报
回复
有没什么好的办法:一次性把应用程序的所有窗体的ADOConnection给断开?????
coeltdit 2004-11-20
  • 打赏
  • 举报
回复
恢复操作的时候,要把当前的数据库连接关闭,通过另一个
TADOConnection连接到Master数据库上
1. ADOConnection1 连接你的业务数据库。
2. ADOConnection2 连接 MASTER 数据库。
3. ADOCommand1.Connection := ADOConnection2;
假设你的数据库名为: DataBaseName
Button.OnClick:
begin
ADOConnection1.Connected := False;
ADOCommand1.CommandText := 'BACKUP DATABASE DataBaseName TO DISK = ' + #39 + 'C:\KKK.BAK' + #39;
ADOCommand1.Execute;
ADOCommand1.CommandText := 'ALTER DATABASE DataBaseName SET OFFLINE WITH ROLLBACK IMMEDIATE';
ADOCommand1.Execute;
ADOCommand1.CommandText := 'RESTORE DATABASE DataBaseName FROM DISK = ' + #39 + 'C:\KKK.BAK' + #39;
ADOCommand1.Execute;
ADOCommand1.CommandText := 'ALTER DATABASE DataBaseName SET ONLINE WITH ROLLBACK IMMEDIATE';
ADOCommand1.Execute;
ADOConnection1.Connected := True;
ADOTable1.Active := true;
end;


wnsr 2004-11-20
  • 打赏
  • 举报
回复
这样可以不用改变connection的连接,你可以改成adocommand
procedure TForm23.Button2Click(Sender: TObject);
begin
adoquery1.SQL.Clear;
adoquery1.SQL.Add('use Master');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('execute sp_helpdevice');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('Restore database test From disk=''d:\text.bak'' with replace');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('Use test');
adoquery1.ExecSQL;
application.MessageBox('数据库完成恢复','警告',MB_OK);
end;

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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