各位朋友,我在一个程序中用到了数据库恢复,以下是SQL语句:
 adoQuery1.sql.text:='use master'+#13
      +' restore FILELISTONLY'
      +' FROM DISK ='''+ExpandFileName(openDlg.filename)+''''
      +' restore database '+trim(edt_Db.text)+' from disk='''+ExpandFileName(openDlg.filename)+''''
      +' WITH REPLACE,'+#13
      +' MOVE '''+logical_data+''' TO '''+phi_name+''', '
      +' MOVE '''+logical_log+''' TO '''+phi_log+''','
      +' recovery'+#13; 
执行完后数据库名字变灰,显示'Loading',再次执行该语句则数据库正常,也就是说,每次要执行两次才可以。另外,如果去掉SQL语句的:
      +' restore FILELISTONLY'
      +' FROM DISK ='''+ExpandFileName(openDlg.filename)+''''
则执行时经常报“超时已过期”错误。
请各位指点一下。

解决方案 »

  1.   

    我的问题解决了,如下:备份:
        modlData.adoDtst_master.Active:=false;
        modlData.adoDtst_master.CommandText:='';
        modlData.adoDtst_master.CommandText:='select * from dbo.sysobjects  where name=''Common_backup''';
        modlData.adoDtst_master.Active:=true;
        if modlData.adoDtst_master.RecordCount = 0 then
        begin
          text := 'create procedure dbo.Common_backup @sDBName varchar(50), @sPath varchar(500) as declare @sql varchar(500) ';
          text:= text + 'if exists(select * from dbo.sysdevices where name=''mydiskdump'')  exec sp_dropdevice ''mydiskdump'' ';
          text:= text + 'if exists(select * from dbo.sysdevices where name=''mydiskdumpLog'')  exec sp_dropdevice ''mydiskdumpLog'' ';
          text:= text + 'set @sql = ''sp_addumpdevice ''''disk'''',''''mydiskdump'''','''''' + @sPath+''\mydiskdump.dat'''''' exec(@sql) ';
          text:= text + 'set @sql = ''sp_addumpdevice ''''disk'''',''''mydiskdumpLog'''','''''' + @sPath +''\mydiskdumpLog.dat'''''' exec(@sql) ';
          text:= text + 'set @sql = ''BACKUP DATABASE '' + @sDBName +'' to mydiskdump'' exec(@sql) ' ;
          text:= text + 'set @sql=''BACKUP LOG '' + @sDBName + '' TO mydiskdumpLog'' exec(@sql) ';      modlData.adoQuery_master.Close;
          modlData.adoQuery_master.SQL.Clear;
          modlData.adoQuery_master.SQL.Add(text);
          modlData.adoQuery_master.ExecSQL;
        end;
        modlData.adoQuery_master.Close;
        modlData.adoQuery_master.SQL.Clear;
        modlData.adoQuery_master.SQL.Add('exec dbo.Common_backup ''veteran'','''+ls_String+'''');
        modlData.adoQuery_master.ExecSQL;    application.MessageBox('备份成功!','提示',mb_ok);
      
    恢复:
    if not FileExists(backup_directory+'\mydiskdump.dat') then
        begin
          application.MessageBox('未找到备份文件!请重新选择!','提示',mb_ok);
          Exit;
        end
        else
        begin
          if modlData.adoConn.Connected=true then modlData.adoConn.Close;      modlData.adoDtst_master.Active:=false;
          modlData.adoDtst_master.CommandText:='';
          modlData.adoDtst_master.CommandText:='select * from dbo.sysobjects  where name=''Common_restore''';
          modlData.adoDtst_master.Active:=true;
          if modlData.adoDtst_master.RecordCount = 0 then
          begin
            text := 'create procedure dbo.Common_restore @sDBName varchar(50) as declare @sql varchar(500),@spid int ';
            text:= text + 'set @sql=''declare getspid cursor for select spid from sysprocesses where dbid=db_id('''''' + @sDBName + '''''')'' ';
            text:= text + 'exec(@sql) open getspid fetch next from getspid into @spid while @@fetch_status <>-1 begin ';
            text:= text + 'exec(''kill '' + @spid) fetch next from getspid into @spid end ';
            text:= text + 'close getspid deallocate getspid ';
            text:= text + 'set @sql = ''RESTORE DATABASE '' + @sDBName +'' from mydiskdump WITH NORECOVERY'' exec(@sql) ' ;
            text:= text + 'set @sql = ''RESTORE LOG '' + @sDBName +'' from mydiskdumpLog'' exec(@sql) ' ;        modlData.adoQuery_master.Close;
            modlData.adoQuery_master.SQL.Clear;
            modlData.adoQuery_master.SQL.Add(text);
            modlData.adoQuery_master.ExecSQL;
          end;
          modlData.adoQuery_master.Close;
          modlData.adoQuery_master.SQL.Clear;
          modlData.adoQuery_master.SQL.Add('use master');
          modlData.adoQuery_master.ExecSQL;
          modlData.adoQuery_master.SQL.Clear;
          modlData.adoQuery_master.SQL.Add('exec dbo.Common_restore ''veteran''');
          modlData.adoQuery_master.ExecSQL;      modlData.adoConn.Connected:=true;      application.messagebox('恢复成功!','提示',mb_ok);
        end;