Sql 还原失败 之 “因为数据库正在使用,所以未能获得对数据库的排它访问权”的处理
2009-09-25 10:46
609 查看
之前没有太在意,这两天在程序中添加备份还原模块,发现备份没为题,还原时出现“因为数据库正在使用,所以未能获得对数据库的排它访问权”,放狗搜了一下,看到遇到类似情况地同志还不少,看了帖子中给出解决的办法是:
1、使用两个TAdoConnection,还原时将要还原数据库的Adoconnection1断开链接,将Adoconnection2链接到Master数据库,但经我多次试验,似乎也不能成功;2、使用存储过程,这个应该能实现,大段的代码我没仔细看,稍显啰嗦。
最后说说我的处理办法,单用一个AdoConnection,没用存储过程,直接上代码吧,一目了然:
核心部分就是这几句:
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
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
相关文章推荐
- SQL还原数据库时发生错误,"因为数据库正在使用,所以未能获得对数据库的排它访问权。"解决方法。
- 解决还原数据库失败,提示 关于“因为数据库正在使用,所以无法获得对数据库的独占访问权”
- 还原数据库 提示 "因为数据库正在使用,所以未能获得对数据库的排它访问权"
- 还原数据库出错:”因为数据库正在使用,所以无法获得对数据库的独占访问权“的解决方案
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 还原数据库出错:”因为数据库正在使用,所以无法获得对数据库的独占访问权“的解决方案
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 还原数据库出错:”因为数据库正在使用,所以无法获得对数据库的独占访问权“的解决方案
- 获取数据库访问独占权,,因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 还原:因为数据库正在使用,所以无法获得对数据库的独占访问权
- 关于数据库还原时出现的因为数据库正在使用,所以无法获得对数据库的独占访问权“的解决方案
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- 关于数据库还原时出现的因为数据库正在使用,所以无法获得对数据库的独占访问权“的解决方案
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法
- SQL Server 2008还原数据时报错“因为数据库正在使用,所以无法获得对数据库的独占访问权”的解决方法
- system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权
- 因为数据库正在使用,所以未能获得对数据库的排它访问权。RESTORE DATABASE 操作异常终止。
- 还原数据库出错:”因为数据库正在使用,所以无法获得对数据库的独占访问权“的解决方案
- 因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法