您的位置:首页 > 数据库

Sql 还原失败 之 “因为数据库正在使用,所以未能获得对数据库的排它访问权”的处理

2009-09-25 10:46 609 查看
之前没有太在意,这两天在程序中添加备份还原模块,发现备份没为题,还原时出现“因为数据库正在使用,所以未能获得对数据库的排它访问权”,放狗搜了一下,看到遇到类似情况地同志还不少,看了帖子中给出解决的办法是:

1、使用两个TAdoConnection,还原时将要还原数据库的Adoconnection1断开链接,将Adoconnection2链接到Master数据库,但经我多次试验,似乎也不能成功;2、使用存储过程,这个应该能实现,大段的代码我没仔细看,稍显啰嗦。

最后说说我的处理办法,单用一个AdoConnection,没用存储过程,直接上代码吧,一目了然:

procedure TBackupOrRevertFrm.SpeedButton1Click(Sender: TObject);
var
sFdir: string;
List:TListItem;
begin
if RadioButton1.Checked=True then     //备份数据
begin
if MessageDlg('您确认要备份数据吗?',mtCustom,[mbYes,mbNo],0)=mrYes then
begin
if Trim(Edit1.Text) = '' then
begin
MessageBox(Handle,'备份文件名不能为空!','信息提示',MB_ICONWARNING + MB_OK);
exit;
end;
if Copy(DirectoryListBox1.Directory,Length(DirectoryListBox1.Directory),1)='/' then
sFdir := DirectoryListBox1.Directory+Edit1.Text+'.MqBk'
else
sFdir := DirectoryListBox1.Directory+'/'+Edit1.Text+'.MqBk';
try
AdoBkRs.Connection := DmFrm.ADOConnection1;
AdoBkRs.Close;
AdoBkRs.SQL.Clear;
AdoBkRs.SQL.Text := 'Backup database MeterInfo To Disk= '''+sFdir+'''';
AdoBkRs.ExecSQL;
AdoBkRs.Close;
except
on e:exception do
begin
MessageBox(Handle,'备份失败!','信息提示',MB_ICONWARNING + MB_OK);
end;
end;
List:=ListView1.Items.Add;
List.ImageIndex:=0;
List.Caption:=Edit1.Text+'.MqBk';
MessageBox(Handle,'备份成功!','信息提示',MB_ICONINFORMATION + MB_OK);
end;
end;
if RadioButton2.Checked then  //还原数据库
begin
if MessageBox(Handle, PChar('请谨慎进行此项操作,还原后可能造成部分数据丢失,确定要还原吗?'),
'询问', MB_ICONWARNING + MB_OKCANCEL + MB_DEFBUTTON2) = IDOK then
begin
if ListView1.Items.Count=0 then //如果为空没有记录卡
begin
ShowMessage('对不起没有发现备份卡,无法恢复数据.');
Exit;
end
else    //如果存在记录卡
begin
if Files='' then   //没有选择恢复文件
begin
ShowMessage('对不起,请重新选择要恢复的备份文件');
Exit;
end
end ;
//开始恢复
if Copy(DirectoryListBox1.Directory,Length(DirectoryListBox1.Directory),1)='/' then
sFdir := DirectoryListBox1.Directory+Files
else
sFdir := DirectoryListBox1.Directory+'/'+Files;
try
Screen.Cursor := crHourGlass;
AdoBkRs.Connection := Dmfrm.ADOConnection1;
AdoBkRs.Close;
AdoBkRs.SQL.Clear;
AdoBkRs.SQL.Add('use master');
AdoBkRs.SQL.Add('ALTER DATABASE MeterInfo SET OFFLINE WITH ROLLBACK IMMEDIATE');
AdoBkRs.SQL.Add('Restore Database MeterInfo From Disk= '''+sFdir+''' with REPLACE ');
AdoBkRs.SQL.Add('ALTER DATABASE MeterInfo SET ONLINE WITH ROLLBACK IMMEDIATE');
Application.ProcessMessages;
AdoBkRs.ExecSQL;
AdoBkRs.Close;
Screen.Cursor := crDefault;
except
on e: exception do
begin
MessageBox(Handle,'还原失败!','信息提示',MB_ICONWARNING + MB_OK);
Screen.Cursor := crDefault;
exit;
end;
end;
MessageBox(Handle,'还原成功!','信息提示',MB_ICONINFORMATION + MB_OK);
end;
end;
end;


核心部分就是这几句:

AdoBkRs.SQL.Add('use master');
AdoBkRs.SQL.Add('ALTER DATABASE MeterInfo SET OFFLINE WITH ROLLBACK IMMEDIATE');
AdoBkRs.SQL.Add('Restore Database MeterInfo From Disk= '''+sFdir+''' with REPLACE ');
AdoBkRs.SQL.Add('ALTER DATABASE MeterInfo SET ONLINE WITH ROLLBACK IMMEDIATE');

另外,使用如今方式亦可(未试验):

用single userEXEC sp_dboption 'dababasename','single user', 'TRUE'
RESTORE DATABASE databasename FROM DISK = 备份文件名 with REPLACE
EXEC sp_dboption 'dababasename','single user', 'false
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐