各位大侠帮帮忙~我们的毕业设计系统是三个人一个小组的,前期大家都是各自做各自的模块,连接数据库有的用ADOQuery,table,Query,各不相同,现在我想做一个系统数据库备份和还原的功能,在还原数据库上出了问题,是不是还原数据库必须是要把所有连接原数据库的程序都关掉?要怎么做才能把多个table,query的连接断开后再还原数据库???期待大家的回答~谢谢`~~~

解决方案 »

  1.   

    备份的话用Backup DataBase Pubs to disk='c:\qqq.bak' 
    还原的话用Restore DataBase Pubs from disk='c:\qqq.bak' 
    你备份的时候,可以直接执行该语句,但是你还原的时候,需要关闭其他连接,有个好的方法,就是你们三个需要统一起数据库的连接方式,可以共用一个数据模块,建议使用ADO来连接数据库,这样的话,需要关闭数据库,只需要adoconnection1.close;就可以了,你可以先试一下.
      

  2.   

    备份:
    procedure TBackupFrm.BitBtn2Click(Sender: TObject);
    begin
      if Edit1.Text= '' then
        begin
          Showmessage('无选择要保存的文件名');
          exit;
        end;
      try
        try
          dmData.adoQryTmp.Active:= false;
          dmData.adoQryTmp.SQL.Clear;
          dmData.adoQryTmp.SQL.Add('BACKUP DATABASE [dzyl] TO DISK = '''+edit1.text+''' WITH INIT');
          dmData.adoQryTmp.ExecSQL;
        finally
          begin
            dmData.adoQryTmp.Active:= false;
            Showmessage('数据库备份成功!');
          end;
        end;
      except
      on e:exception do
        begin
          ShowMessage('数据库备份失败!');
        end;
      end;
    end;
    ---------------
    恢复
    procedure TBackupFrm.BitBtn4Click(Sender: TObject);
    begin
      if Edit2.Text = '' then
        begin
          showmessage('未选择要恢复的数据库文件!');
          exit;
        end;
      with dmData do
      begin
        try
          adocmmd.CommandText:='use master';
          adocmmd.Execute;
          adocmmd.CommandText:=' alter database dzyl set offline with rollback immediate';
          adocmmd.Execute;
          adocmmd.CommandText:='restore database dzyl from disk= '''+edit2.Text+''' with recovery ';
          adocmmd.Execute;
          adocmmd.CommandText:=' alter database dzyl set online with rollback immediate';
          adocmmd.Execute;
          showmessage('数据库恢复成功!');
          application.Terminate;
        except
        on e:exception do
          begin
            showmessage('数据库恢复失败!'+e.Message);
          end;    end;
      end;
      end;
    dmData.adoQryTmp连接的是系统MASTER数据库,备份还原之前应该关闭要备份还原的AdoConn数据库连接
    AdoConn.Connected:=False;
      

  3.   

    woshihaoge(支离破碎),谢谢你的回答。我自己试着编了一个程序,使用ADO来连接数据库的方法,关闭数据库时采用adoconnection1.close;可以成功的还原数据库。哎,问题是大家都不想改连接数据库的方式,因为涉及太多的查询、增、删、改操作了。我上网查找了相关资料,有的人说:“断开,其他程序的连接,可用杀进程的方法!”,不知道该怎么做??
    我想先试一试其他办法,最后不行的话再大家一起改连接数据库的方式~~
      

  4.   

    luckyboy97(幸运男孩),谢谢你的回答~~
      

  5.   

    luckyboy97(幸运男孩),你的方法对于我的情况有点行不通
      

  6.   

    把所有对数据库的连接,使用同一个AdoConnection控件
      

  7.   

    whbo(王红波(年轻人,要有所作为)) ,谢谢你的回答,问题是大家现在还不想改连接方式,为涉及太多的查询、增、删、改操作了,改起来麻烦~
    我想用杀进程的方法,有人懂吗?谢谢大家了~
      

  8.   

    use master
    create  proc  killspid  (@dbname  varchar(20))
    as
    begin
    declare  @sql  nvarchar(500),@temp varchar(1000)
    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 =0
    begin
      set @temp='kill  '+rtrim(@spid)
      exec(@temp)
    fetch  next  from  getspid  into  @spid
    end
    close  getspid
    deallocate  getspid
    endGO=================
    杀死数据库进程
      

  9.   

    hsmserver(撒哈拉之雨的悲伤)前辈你好!能解释一下吗?我是菜鸟,看不太懂~谢谢你了
      

  10.   

    用sql语句backup 'RESTORE 等,也可以用sql server中的存储过程
    下面的例子是我贴来的,不知道能不能用,不过大概可以起个引导作用。procedure TBak.btnRestoreClick(Sender: TObject);
    var
      Qry:TADOQuery;
    begin
      if FileExists(self.edtReStorePath.Text) then
        begin
          DM.Conn.Connected:=False; //断开系统数据库连接
          Qry:=TADOQuery.Create(self);
          Qry.CommandTimeout:=120;
          //把连接转移到master库
          Qry.ConnectionString:='Provider=SQLOLEDB.1;Password='+Login.GetDBServerInfo('Pwd')+';Persist Security Info=True;User ID='+Login.GetDBServerInfo('User')+';Initial Catalog=master;Data Source='+Login.GetDBServerInfo('Server');
          //-------------------端开rxd_CRM库------------------------------------------
          Qry.Close;
          Qry.SQL.Clear;
          Qry.SQL.Text:='ALTER DATABASE rxd_CRM SET OFFLINE WITH ROLLBACK IMMEDIATE';
          Qry.Prepared;
          Qry.ExecSQL;
          //------------------- 端开rxd_CRM库结束-------------------------------------
          Qry.Close;
          Qry.SQL.Clear;
          Qry.SQL.Text:='RESTORE DATABASE rxd_CRM FROM DISK='''+self.edtReStorePath.Text+''' with replace';
          Qry.Prepared;
          try
            Qry.ExecSQL;
            Login.MsgInfo('成功恢复数据!');
          finally
            //-------------------重新连接rxd_CRM库------------------------------------
            Qry.Close;
            Qry.SQL.Clear;
            Qry.SQL.Text:='ALTER DATABASE rxd_CRM SET ONLINE WITH ROLLBACK IMMEDIATE';
            Qry.Prepared;
            Qry.ExecSQL;
            //-------------------重新连接rxd_CRM库结束--------------------------------
            Qry.Free;
            DM.Conn.ConnectionString:=Login.GetDBServerInfo('DBStr');
            try
              DM.Conn.Connected:=True;
            except
              Login.MsgError('连接数据库失败,请尝试重启系统!');
            end;
          end
        end
      else
        begin
          Login.MsgInfo('数据文件不存在,请重新选择!');
          self.edtReStorePath.SetFocus;
        end;
    end;