请教一个数据库恢复的问题
我用的是SQL数据库,现在要在程序里实现数据库的恢复(备份已经做好),就是把前面备份好的数据库文件覆盖掉现在的数据库文件,我用RESTORE DATABASE DataBaseName 
   FROM DISK = 'c:\myback.bak'
但提示说数据库正在被使用(我的程序是连接到这个数据库的)。
我听说要先关掉SERVICE MANAGER和断开连接才行,请问在程序里面怎么解决?

解决方案 »

  1.   

    有人给我这样一段代码,说这样可以:
    ADOCommand1.CommandText:='use master';
      ADOCommand1.Execute;
      ADOCommand1.CommandText := 'ALTER DATABASE '+sDBname
      +' SET OFFLINE WITH ROLLBACK IMMEDIATE';
      ADOCommand1.Execute;
      ADOCommand1.CommandText:='restore database '+sDBname
      +'  from disk='+ quotedStr(EditPath.Text);
      ADOCommand1.Execute;
      ADOCommand1.CommandText := 'ALTER DATABASE '+sDBname
      +' SET ONLINE WITH ROLLBACK IMMEDIATE'; 
      ADOCommand1.Execute; 
    但我试了一下好象不行!哪位帮我看看(可能是SDBNAME那搞错了,这到底是什么意思?);
      

  2.   

    主要就是'use master','ALTER DATABASE ',sDBname,'restore database '
    各自都代表什么意思?
    看不懂,请帮忙解释一下
    或者另外给个方法
      

  3.   

    use master:默認打開master數據庫
    sdbname:你的數據庫備份文件名.
    restore database:你的數據庫文件所在的目錄
    一己之見,請高手指點.
      

  4.   

    这样不行,虽然有了一个数据库的备份文件,但直接恢复的错误你已经看到了,要首先用sp_addumpdevice创建一个备份设备,把数据库的备份文件放在备份设备的目录里,然后再恢复.这个东西我已经研究久了,我的数据库安装就是这样做的.安全性,速度等都很好,我这里有代码,要的说一声.
      

  5.   

    恢复的时候的确需要断开与数据库的所有链接,不能有任何读写和链接 use Master  先转到 Master 上再恢复
      

  6.   

    用一个 ADOConnection2 链接到 Master 
    关闭 ADOConnection1 ; //你的程序中的
    ADOQuery1链接到 ADOConnection2 , 恢复 代码 短消息中(写的粗糙见谅)
      

  7.   

    adoconnection2是不是也是连接到那个要恢复的数据库?
      

  8.   

    出错说我的adoconnection2没有定义;
    Master是什么意思?
      

  9.   

    wrwr8111(路灯) Master是SQL安装时自带的数据库。
      

  10.   

    出错说我的adoconnection2没有定义;----------------------------------拉一个过来
      

  11.   

    Master 是系统库,里面有好多与系统相关的表,存储过程 ,我也不大懂 ,Study
      

  12.   

    链接到 Master
    是不是就是adoconnection2。ConnectionString := 'master' ?
      

  13.   

    不是了 连接字符串你可以用一个 ADOConnection 链接 Master 得到 或者来一个控件不动态创建
      

  14.   

    和你那个 ADOConnection1 就数据库名称不同 。 看看 ADOConnection1.ConnectionString ,改一下
      

  15.   

    有错:他说sql service不存在或访问被拒绝
      

  16.   

    procedure Tsjbfhfform.BitBtn2Click(Sender: TObject);
    begin
    datamodule1.ADOConnection1.Close ;//关闭数据库链接
    ADOConnection2 := TADOConnection.Create(Self) ;
    with ADOConnection2 do
    begin
      ConnectionString := 'Provider=SQLOLEDB.1;password=wr8111;Persist Security Info=true;User ID=tyadmin;Initial Catalog=master;Data Source=wrwr-h48gmkdje7;'+
      'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=wrwr-h48gmkdje7;Use Encryption for Data=False;Tag with column collation when possible=False' ;//链接到 Master ;
      LoginPrompt := False ;
      Open ;
    end;with adoquery1 do
    begin
    close;
    Connection := ADOConnection2 ;
    sql.Clear;
    sql.add('Restore database tyjxc from disk=:prm_disk  WITH replace,stats');
    parameters.ParamByName('prm_disk').Value:='c:\myback.bak';
    execsql;
    showmessage('已成功恢复!');
    end;
    end;
    这样的
    他说我的数据库正被访问
      

  17.   

    看看别的地方有没有链接procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ADOQuery1 do
      begin
        Sql.Text := 'Restore DataBase FreeDb from Disk = ''d:\forback.Bak''' ;
        ExecSql ;
      end;
      ShowMessage('ok') ;
    end;我这儿没错
      

  18.   

    没有啊
    我就一个adoconnection啊,其他的都是adoquery连接adoconnection的
    怎么办?
      

  19.   

    新建一个工程单单链接 Master,在这个程序中看看能不能恢复(应该可以) 。就能说明,程序中别的地方还有链接没有关闭
      

  20.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ADOQuery1 do
      begin
        Sql.Text := 'Restore DataBase FreeDb from Disk = ''d:\a.Bak''' ;
        ExecSql ;
      end;
      ShowMessage('okok') ;
    end;end.我这儿可以呀 ,你看看是不是企业管理器或者其他别的程序在用
      

  21.   

    但我的程序是手工连接的(就是在程序里默认为打开)这句话的意思是连接在程序里默然为TRUE,但程序没有打开的。
      

  22.   

    程序没有运行就没有关系,在 Delphi 中是不是打开着 ?
      

  23.   

    没有运行的。
    而且我把SQL也关了
    不知道还有什么问题,你帮我看看程序是不是没有问题了?
      

  24.   

    procedure Tsjbfhfform.BitBtn2Click(Sender: TObject);
    begin
    datamodule1.ADOConnection1.Close ;//关闭数据库链接
    ADOConnection2 := TADOConnection.Create(Self) ;
    with ADOConnection2 do
    begin
      ConnectionString := 'Provider=SQLOLEDB.1;password=wr8111;Persist Security Info=true;User ID=tyadmin;Initial Catalog=master;Data Source=wrwr-h48gmkdje7;'+
      'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=wrwr-h48gmkdje7;Use Encryption for Data=False;Tag with column collation when possible=False' ;//链接到 Master ;
      LoginPrompt := False ;
      Open ;
    end;with adoquery1 do
    begin
    close;
    Connection := ADOConnection2 ;
    sql.Clear;
    sql.add('Restore database tyjxc from disk=:prm_disk  WITH replace,stats');
    parameters.ParamByName('prm_disk').Value:='c:\myback.bak';
    execsql;
    showmessage('已成功恢复!');
    end;
    end;
    就是这段有问题啊!(因为我重试了一个小的就做恢复,也有同样的错)
      

  25.   

    新建一个工程,不要 DataModule ,就在窗体上拉一个链到 Master ,再 ...