use master
go
exec killspid 'aa'
go
restore database aa from disk='c:\aa.bak' with replace
go
use aa

解决方案 »

  1.   

    SERVER端的语句已经是:
    user master
    exec killspid 'aa'
    restore database aa from disk='c:\aa.bak' with replace
    use aa
    还是不行呀
      

  2.   

    你用ADO,创建连接,要保证此连接上不能有其他连接,
    再说,强制中断,可能会造成数据丢失,还是去掉,exec killspid 'aa' 比较好,
      

  3.   

    可是若不用exec killspid 'aa'的话,不能执行restore语句。
      

  4.   

    我把我的程序帖出来,给各位高手看看,要如何修改?
    SERVER端程序代码如下:
    begin
      if DM_s.ADOConnection1.Connected then
        begin
          with DM_s.ADOQuery9 do
          begin
            close;
            sql.Clear;
            sql.Add('use master');
            prepared;
            execsql;
            close;
            sql.Clear;
            sql.Add('exec killspid ''aa''');
            prepared;
            execsql;
            close;
            sql.Clear;
            sql.Add('restore database aa from disk='c:\aa.bak' with replace');
            prepared;
            try
              execsql;
              showmessage('恢复系统数据库成功!');
            except
              showmessage('恢复系统数据库出错!');
            end;
            close;
            sql.Clear;
            sql.Add('use aa');
            prepared;
            execsql;
          end;
        end
        else
          begin
            showmessage('数据库连接失败!');
            Application.Terminate;
          end;
    end;
    CLIENT端程序代码如下:
    BUTTON双击事件:
    begin
      if DM.ADOConnection1.Connected then
      begin
        with DM.ADOQuery1 do
        begin
          Close;
          sql.Clear;
          sql.Add('select * from User order by UserName');
          prepared:=true;
          Open;
        end;
      end
      else
        begin
          showmessage('数据库连接失败!');
          Application.Terminate;
        end; 
    end;
    当SERVER端和CLIENT端程序都在运行时,SERVER执行数据恢复操作后,在CLIENT端双击BUTTON出现“连接失败”的提示。
      

  5.   

    你可以通过下面的SP,来返回数据库的状态。当@RC=-2时,你就可以提示一个信息给CLIENT.
    create proc usp_CheckDBStatus
      @chr_dbname sysname
    asSET NOCOUNT ON/******************************************************************/
    /* initialization   */
    /******************************************************************/
    Declare @rc int
    Declare @Status int
    Declare @output varchar(255)select @rc=0
    select @Status=0
    select @output=''if @chr_dbname is null
    begin
    select @rc=-1
    return @rc
    end/******************************************************************/
    /* Get STATUS from MASTER..SYSDATABASES   */
    /******************************************************************/
    if @rc=0
    begin
    select @status=status&192 from master..sysdatabases
    where [name]=@chr_dbname if @status=192
    begin
    select @rc=-2
    print @chr_dbname +'status is pre recovery or recovering'
    end
    else
    begin
    print @chr_dbname +'status is not in pre recovery or recovering'
    end
    end