错误信息:
  因为数据库正在使用,所以未能获得对数据库的排它访问权。代码如下:
var
  RestoreDB:TADOConnection;
  op:TADOQuery;
begin
  if ReBackupDialog.Execute then
  begin
    dbm.dbconn.close;    RestoreDB:=TADOConnection.Create(self);
    RestoreDB.ConnectionString:='Provider=SQLOLEDB.1;Persist Secrety Info=FALSE;User ID=sa;Password=sa;Initial Catalog=master;Data Source=myserver;
    RestoreDB.LoginPrompt:=false;
    RestoreDB.Open;    op:=TADOQuery.Create(self);
    op.Connection:=RestoreDB;
    op.SQL.Clear;
    op.SQL.Add('Restore DataBase mydatabase from Disk = '''+ReBackupDialog.FileName+''' with replace');
    op.ExecSQL;
    //showmessage('ok');
    op.Close;
    op.Free;    RestoreDB.Close;
    RestoreDB.Free;                          
end;

解决方案 »

  1.   

    CREATE PROCEDURE RestoreDatabase 
    (
      @usedbname      varchar(100),@setfolder   varchar(250)
    )
    AS
    begin declare @sname      char(8) set @sname='restr'    EXEC  sp_addumpdevice 'disk',  @sname,@setfolder  RESTORE FILELISTONLY FROM  @sname
        RESTORE DATABASE @usedbname from  @sname with RECOVERY  EXEC  sp_dropdevice  @sname  return(0)end
      

  2.   

    1、////////////////////////////////////////比较安全
      在Master数据库中建如下存储过程:
    Create Procedure killspid (@dbname varchar(20))
    as
    begin
    declare @sql nvarchar(500)
    declare @spid int
    set @sql='declare getspid cursor for 
    select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
    exec (@sql)
    open getspid
    fetch next from getspid into @spid
    while @@fetch_status<>-1
    begin
    exec('kill '+@spid)
    fetch next from getspid into @spid
    end
    close getspid
    deallocate getspid
    endGO
    在恢复数据库之前先执行此存储过程,像这样:Use Master
    Go
    exec killspid 'mydb'
    Go
    restore database mydb from disk='c:\mydb.bak'在Delphi中直接用ExecSQL先后执行以上SQL语句即可
    2、/////////////////////////////适合单机
    AdoConnection1不用断开,
    使用一个adoquery,SQL语句如下:
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('use master');
    adoquery1.SQL.Add('restore database mydb from disk='''c:\mydb.bak''');
    adoquery1.SQL.Add('use mydb');恢复数据库之前一定要user master !
    以上摘自其他网友的回复。
      

  3.   

    如果网络版的话,把连接都KILL了,别的正连接着的用户不就也断了吗?