其实首先就很简单:
1.数据库有人在使用时,不能还原,因为sql无法确定这样覆盖数据库是否会带来灾难性的后果
  所以还原成现有的数据库时,必须断开所有用户对该数据库的连接2.你不能站在凳子换自己站住的登子,必须借助其他凳子(即先离开自己站的凳子)才能换掉自己脚下的
  这句话的意思就是,如果你要还原的数据库名是你自己当前连接的数据库的话,必须断开自己的连接
  切换到master数据库再还原.

解决方案 »

  1.   

    o,这么迟还回答我,真是太感激了!
    我现在还比较郁闷,以下代码,在家里OK,在公司里不行!
    ExecCmd为自写函数,就是一个ADOCommand直接执行;procedure TfrmDBBak.DBRestore(DBName, DatPath, LogPath: string);
    begin
    //--数据库恢复
    //注释
    //在还原过程中,指定的数据库必须不处于使用状态。指定数据库中的任何数据将由还原的数据替换。  ExecCmd('USE master');
      ExecCmd('EXEC sp_dropdevice ''BackupDat''');
      ExecCmd('EXEC sp_addumpdevice ''disk'', ''BackupDat'','''+DatPath+'''');
      ExecCmd('RESTORE DATABASE '+DBName+' FROM BackupDat');    // 出错行
    end;
      

  2.   

    ExecCmd('USE master'); //这个没有什么用的
      

  3.   

    o,好!我还试了
    RESTORE  DATABASE  star  FROM  disk='C:\Documents and Settings\Administrator\桌面\star.BAK'-- star为一个数据库;直接在查询分析器里就OK了!我还想问一下这个问题与SQLServer的pack有关吗?!
      

  4.   

    这个问题与pack没有直接关系.这是你程序代码控制得不好(很多程序在没有退出前,也不能关闭自己对数据库的引用,这个我觉得关系大一点)不过,不打补丁的话,莫名其妙的问题总是特别多,所以建议你没有装补丁的话,一定要装上
      

  5.   

    经我在Delphi6中的测试,    发现注释ExecCmd('USE master'); 后不行,一直提示“因为数据库正在使用,所以未能获得对数据库的排它访问权。”    使用ExecCmd('USE master'); 后就OK了;
      

  6.   

    我的意思是,ExecCmd('USE master'); 这个的效用不大,不是说要注释掉它不知道你用的是长连接的方式(即一进入程序,就连接数据库,在退出程序前,这个连接是一直保持的),还是短连接的方式(仅在执行需要时才去连接数据库)如果是长连接,你可以恢复数据库名指定为你自己连接的数据库,看看你的这个 ExecCmd('USE master')
    有没有作用如果是短连接,你可以试试在企业管理器中展开你要还原的数据库,再试试这个 ExecCmd('USE master')有没有作用