你先把数据库相关的程序都关掉,然后再查询分析器中restore语句前增加
use master
Go

解决方案 »

  1.   

    在备份的时候应该先使用
    use master 
    Restore DataBase shenji from shenji200207212115 with replace
    ok 可以结帐了
      

  2.   

    我用一个DataBase连接Server的shenji数据库,一些Table和Query连接在DataBase上,其中包含用于备份和恢复的Query。我的恢复按钮代码如下:
        as_DeviceName:=ListView1.Selected.Caption;
        ls_Sql:='use master Restore DataBase shenji from '+as_DeviceName+' with replace';    DataM.T_cominfo.Close;
        DataM.T_codeinfo.Close;
        DataM.T_com0.Close;
        DataM.T_com1.Close;
        DataM.T_com2.Close;
        DataM.T_offinfo.Close;
        DataM.Q_query.Close;
        DataM.Q_sample.Close;
        DataM.Q_sign.Close;    DataM.Q_backup.Close;
        DataM.Q_backup.SQL.Clear;
        DataM.Q_backup.SQL.Add(ls_Sql);
        DataM.Q_backup.ExecSQL;
        DataM.Q_backup.Close;
    总是说没有排它访问权,我应该怎样修改代码呀??????????????还有! 我把DataBase的KeepConnection和Connected都设置为False,为什么运行程序其它表还能打开???再者!怎样动态改变DataBase所连接的数据库???
     
    请大家帮帮忙呀! 感激不尽!!!
      

  3.   

    程序中可以使用多个DataBase的,在使用TQuery连接时,在执行open和ExecSQL之前改变TQuery的DataBaseName属性就可以了,像你备份的问题,开始时就应该连接到master上去,而不是在Query中写use master,我们写的是查询分析器中的操作情况。‘再者!怎样动态改变DataBase所连接的数据库???’这个问题的答案如上。如果“DataBase的KeepConnection和Connected都设置为False”而且你的Query是通过DataBase连接的(例如你通过外部alias name这种当然不用TDatabase)是不应该“表还能打开:”
      

  4.   

    as_DeviceName:=ListView1.Selected.Caption;
        ls_Sql:='Restore DataBase shenji from '+as_DeviceName+' with replace';    DataM.Database1.Connected:=False;
        DataM.Database2.Connected:=True;    DataM.Q_backup.Close;
        DataM.Q_backup.SQL.Clear;
        DataM.Q_backup.SQL.Add(ls_Sql);
    两个DataBase都是KeepConnection:=False,还是一样的错误呀!
    总是说数据库正在使用,可是我并没有使用呀!    DataM.Q_backup.ExecSQL;
        DataM.Q_backup.Close;
      

  5.   

    DataM.Q_backup.DatabaseName:=你在DataM.Database1中的属性databasename
    DataBase1应该是连接到Master的TDatabase
      

  6.   

    是的!  我就是这么连的!而且我刚做过一个试验!两个DataBase:
    DataBase1:
        Connected=Ture
        KeepConnection = False
        LoginPrompt = False
    DataBase2:
        Connected=False
        KeepConnection = False
        LoginPrompt = False
    DataBase1连接shenji库,DataBase2连接master库,用于恢复备份的Query连接在DataBase2上!
    button代码:
        DataBase1.Connected:=False;
        DataBase2.Connected:=True;
        Query2.ExecSQL;
        DataBase2.Connected:=False;
        DataBase1.Connected:=True;
        Table1.Open;
    还是原来的错误!  
    如果开始DataBase1.connected=False在运行,就可以恢复了!
    这可怎么办呀! 我还有其他好多Table和Query要在备份恢复前打开呢!
    请高手帮忙呀!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  7.   

    不是吧,这么简单的问题,怎么还没有结帖呀。
    不是讲了
    use master
    go
    在恢复。就可以了,你在干什么啊。
    你测试了没有
      

  8.   


    查询分析器里面写,
    如果在delphi 里面
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add('use master');
    adoquery1.sql.add('go');
    adoquery1.sql.add('Restore DataBase shenji from shenji200207212115 with replace );
    adoquery1.execsql;
      

  9.   

    EXEC sp_dboption 'your database','single user',true
    goRestore DataBase shenji from shenji200207212115 with replace
    go
    建立一个新 ADOConnection用 ADOCommand 实现,数据库选择 master.
      

  10.   


    查询分析器里面写,
    如果在delphi 里面
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add('use master');
    adoquery1.sql.add('go');
    adoquery1.sql.add('Restore DataBase shenji from shenji200207212115 with replace );
    adoquery1.execsql;
      

  11.   

    我就是use master!
    我做试验时DataBase2默认连接在Master上!
    我就是不明白为什么DataBase1能连接库,否则Database2没有排他权,我都在代码中关闭连接了呀!  不应该没有呀!
    必须! DataBase1一开始就不连接,DataBase2才好用!  这不等于DataBase1没有用吗! 我还有好多Table和Query连在上面有用呢!
    请问怎么办! 
    难道BDE不行,非要改ADO这可麻烦了!
      

  12.   

    我用ADO也试过了!
    也是这样!  这是怎么回事呀!
    除非程序一开始数据库什么也连就能恢复备份!
    否则就不行!  好像是断不开其他与数据库相连的控件!
    可是!我在代码中将:Connected=False KeepConnection = False
    应该可以断开吧!  (use master我也试过,跟这个没关系)
    请大家帮帮忙呀!!!!!!!!!!!!!!!!!!
      

  13.   

    try
      //使用 master 数据库
      query1.close;
      query1.sql := 'use master';
      query1.execsql;  //设置 shenji 为单用户模式
      //请自己将 "" 进行处理 使得命令为 EXEC sp_dboption 'shenji','single user',true
      query1.sql := 'EXEC sp_dboption "shenji","single user",true';
      query1.execsql;  query1.sql.text := 'Restore DataBase shenji from shenji200207212115 with replace';
      query1.execsql;  //设置 shenji 为非单用户模式
      //请自己将 "" 进行处理 使得命令为 EXEC sp_dboption 'shenji','single user',true
      query1.sql := 'EXEC sp_dboption "shenji","single user",true';
      query1.execsql;  //使用 shenji 数据库
      query1.close;
      query1.sql := 'use shenji';
      query1.execsql;except
      //异常处理
      //设置 shenji 为非单用户模式
      //请自己将 "" 进行处理 使得命令为 EXEC sp_dboption 'shenji','single user',true
      query1.sql := 'EXEC sp_dboption "shenji","single user",true';
      query1.execsql;
    end;
      

  14.   

    你看看我的程序(使用中)
    function TRestoreIt.BackUpDatabase:boolean;
    var
      sLogicNameOfData,sLogicNameOfLog:string;
      sPhysicalNameOfData,sPhysicalNameOfLog:string;
      dSizeOfData,dSizeOfLog:DWORD;
    begin
      With frmMenu.adoqrySys do
      try
        pServer:=rsServerName;
        pDatabase:=rsDatabase;
        pUser:=rsUser;
        pPassWord:=rsPassword;
        frmMenu.adcBack.Close;
        frmMenu.adcBack.LoginPrompt:=False;
        frmMenu.adcBack.Params.Values['Server Name']:=pServer;
        frmMenu.adcBack.Params.Values['Database Name']:='master';
        frmMenu.adcBack.Params.Values['User Name']:=rsUser;
        frmMenu.adcBack.Params.Values['Password']:=rsPassword;
        frmMenu.adcBack.Open;
        Close;
        DatabaseName:='Back';    if Not FileExists(Directory+BackUpFile) then
          Raise Exception.Create('备份文件丢失:'+Directory+BackUpFile);    Application.ProcessMessages;
        Close;
        SQL.Clear;
        SQL.Add('USE master');
        SQL.Add('Select Name from sysdevices Where Name='''+DumpDevice+'''');
        Open;
        if Not Eof then
        begin
          Close;
          SQL.Clear;
          SQL.Add('USE master');
          SQL.Add('EXEC sp_dropdevice '''+DumpDevice+'''');
          ExecSQL;
        end;
        Close;
        SQL.Clear;
        SQL.Add('USE master');
        {
        if Copy(Directory,1,1)='\' then
          SQL.Add('EXEC sp_addumpdevice ''pipe'', '''+DumpDevice+''','''+Directory+BackUpFile+'''')
        else
        }
          SQL.Add('EXEC sp_addumpdevice ''disk'', '''+DumpDevice+''','''+Directory+BackUpFile+'''');
        ExecSQL;
        Application.ProcessMessages;
        Close;
        SQL.Clear;
        SQL.Add('Use Master');
        SQL.Add('RESTORE FILELISTONLY from '+DumpDevice);
        Open;
        //注意此处尚未加上正常的异常处理,因为我忘了怎么写
        First;
        if UpperCase(FieldByName('Type').AsString)='D' then
        begin
          sLogicNameOfData   :=FieldByName('LogicalName').AsString;
          sPhysicalNameOfData:=FieldByName('PhysicalName').AsString;
          dSizeOfData        :=FieldByName('Size').Value;
        end;
        if UpperCase(FieldByName('Type').AsString)='L' then
        begin
          sLogicNameOfLog    :=FieldByName('LogicalName').AsString;
          sPhysicalNameOfLog :=FieldByName('PhysicalName').AsString;
          dSizeOfLog         :=FieldByName('Size').Value;
        end;
        Next;
        if UpperCase(FieldByName('Type').AsString)='D' then
        begin
          sLogicNameOfData:=FieldByName('LogicalName').AsString;
          sPhysicalNameOfData:=FieldByName('PhysicalName').AsString;
          dSizeOfData        :=FieldByName('Size').Value;
        end;
        if UpperCase(FieldByName('Type').AsString)='L' then
        begin
          sLogicNameOfLog    :=FieldByName('LogicalName').AsString;
          sPhysicalNameOfLog :=FieldByName('PhysicalName').AsString;
          dSizeOfLog         :=FieldByName('Size').Value;
        end;    Close;
        SQL.Clear;
        SQL.Add('Use Master');
        SQL.Add('RESTORE DATABASE '+rsDatabase);
        SQL.Add('FROM '+DumpDevice);
        if not bDiffer then
          SQL.Add('WITH REPLACE,')
        else
          SQL.Add('WITH');
        SQL.Add('MOVE '''+sLogicNameOfData+''' TO '''+rsDirectory+'.MDF'',');
        SQL.Add('MOVE '''+sLogicNameOfLog+''' TO '''+rsDirectory+'.LDF''');
        ExecSQL;
        Application.ProcessMessages;
        Close;
        SQL.Clear;
        SQL.Add('USE master');
        SQL.Add('EXEC sp_dropdevice '''+DumpDevice+'''');
        ExecSQL;
        lblCaption.Caption :='';
        bBeLooping:=False;
        MyShowMessage('数据库恢复完成!');
        frmInitialize_Step3.Close;
        Result:=True;
      except
        on E:Exception do
        begin
          ShowMessage(E.Message);
          WriteErrlog('复制到备分服务器',E.Message);
          Result:=False;
        end;
      end;
    end;