dm.ADOCon.Connected:=false;
   sqls:='use master restore database exam from disk='''+ss+''' with REPLACE ';
   dm.DBSetQ.ConnectionString:=MainFrm.cons;
   dm.DBSetQ.Close;
   dm.DBSetQ.SQL.Clear;
   dm.DBSetQ.SQL.Add(sqls);
   dm.DBSetQ.ExecSQL;
语句能够执行,但执行的结果是数据库没任何改变。
在sql server的事件跟踪器中显示Reads,Writes项均比手工还原的数值小!
不知是何原因,请教各位有没遇到类似情形!

解决方案 »

  1.   

    转贴:
    当我恢复时出错:
    with query1 do
    begin
    close;
    sql.Clear;
    sql.Add(format('RESTORE DATABASE tushu FROM DISK=''%s''',[gn]));
    execsql;错误提示为:
    因为数据库正在使用,未能获得数据库的排它访问权
    请问该怎么做???
    在查询分析器中运行
    use master
    goif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_killspid]
    GOcreate 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
    goprocedure TForm3.Button2Click(Sender: TObject);
    begin
    if opendialog1.Execute then
    begin
    adoquery1.SQL.Text:='use master;exec p_killspid mydatabase;Restore database madatabase From disk='''+opendialog1.FileName+''';Use mydatabase';
    adoquery1.ExecSQL;
    application.MessageBox('数据库完成恢复','提示',MB_OK);
    end;
    end;
      

  2.   

    /*
    我也是这么写的
    (还原过程中不能有任何程序访问数据库)
    还原后强制退出软件,再登陆
    如果没有其他程序访问数据库的话,一般能还原成功
    */
    ExecuteSql('use master');
                ExecuteSql(Format('RESTORE DATABASE %s FROM DISK =''%s''  with replace',[g_sDefaultdb,FileName]));            fmMain.bsSkinMessage1.MessageDlg('数据库恢复已完成,请重新启动程序!',mtInformation,[mbOK],0);
                Application.Terminate;
                Abort;
      

  3.   

    procedure TForm3.Button1Click(Sender: TObject);
    var
      Str: string;
    begin
      DataModule2.ADOConnection1.Connected := false;
      ADOConn.Connected := False;
      ADOConn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=SAILOR';
      ADOConn.Open;
      if edit1.Text <> '' then
      begin
        Str := 'restore database test from disk = '+ #39 + edit1.Text + #39 + ' with replace, '
           + 'move ' + #39 + 'test_data' + #39 + ' to ' + #39 + 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Data.MDF' + #39
           + ',move ' + #39 + 'test_log' + #39 + ' to ' + #39 + 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' + #39;
        with Adoquery1 do
        begin
          close;
          sql.Clear;
          sql.Add('ALTER DATABASE test SET OFFLINE WITH ROLLBACK IMMEDIATE');
          try
            ExecSQL;
          except      end;
          close;
          sql.Clear;
          sql.Text := Str;
          try
            execsql;
            application.MessageBox('成功','asdf',mb_ok+ mb_iconinformation);
          except
            application.MessageBox('错误','asdf',mb_ok+ mb_iconstop);
          end;
          close;
          sql.Clear;
          sql.Add('ALTER DATABASE test SET ONLINE WITH ROLLBACK IMMEDIATE');
          try
            ExecSQL;
          except      end;
        end;
      end;
      ADOConn.Connected := false;
      DataModule2.ADOConnection1.Connected := True;
    end;
      

  4.   

    在master里创建存储过程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以上这个最重要,没有这个不可以换原的
    procedure TForm23.Button2Click(Sender: TObject);
    begin
    if opendialog1.Execute then
    begin
    adoquery1.SQL.Text:='use master;exec p_killspid mydatabase;Restore database madatabase From disk='''+opendialog1.FileName+''';Use mydatabase';
    adoquery1.ExecSQL;
    application.MessageBox('数据库完成恢复','警告',MB_OK);
    end;
    end;
    我就是这么恢复的,绝对可行,不行的话大概是你哪个环节没处理好