我使用如下SQL语句在Delphi7+SQL Server 2005中从备份文件(作为参数从外部传入)恢复数据库.(全部替换,不需要保留原库记录)
数据库管理员,使用windows授权方式访问
但是同样的代码在'SQL Server Management Studio'中可以恢复数据库(主要失败的原因是无法独占打开数据库,导致恢复失败)
而在Delphi执行期,执行语句不会报错,但是数据库并没有恢复.请教各位大侠:
1.正确的恢复数据库的方法是不是这样的?
2.如果这个方法正确,是否是因为无法独占打开数据库而导致恢复数据库失败?那么有没有方法从ADO数据接口获取数据库独占访问方式
3."而在Delphi执行期,执行语句不会报错,但是数据库并没有恢复",用什么方法可以获取SQL Server 2005返回的错误信息?---------------
USE MasterDECLARE @DBName nvarchar(50)
DECLARE @BakFile nvarchar(1000)set @DBName = '[Layout]'
set @BakFile = N'%s'--备份的路径RESTORE DATABASE @DBName
FROM  DISK = @BakFile
WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  REPLACE

解决方案 »

  1.   

    1、程序是不是和SQL SERVER在同一台电脑上?如果不在同一台电脑上,没办法恢复的
    2、建议将恢复的SQL写成存储过程,在程序上调用,应该就可以了。
      

  2.   

    http://www.delphibbs.com/keylife/iblog_show.asp?xid=17743
    这里有一个通用的存储过程,你可以参考一下
      

  3.   

    一般情况下都是在Master中创建一个存储过程,该过程主要作用是关闭Active的连接,而后通过存储过程来恢复数据库
      

  4.   

    感谢各位的热情回复问题已经解决,要点有两个
    1、除去了自己的,杀掉所有连接
    2、恢复数据库要用recovery参数1中对应的ADOQ的执行语句是:
      declare @spid varchar(20);
      declare #spid cursor for
        select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id('Layout');
        
      open #spid;
      
      fetch next from #spid into @spid;
      
      while @@fetch_status = 0
      begin
        if (cast(@@SPID as varchar(20)) != @spid) --这个条件是我加的(ADOQ不能杀死自己的连接,但是在MS SQL Studio中可以),其他的来自邹建 2003.10的作品
          exec('kill '+@spid);
        fetch next from #spid into @spid;
      end;
      close #spid;
      deallocate #spid;
    2中对应的ADOQ的执行语句是:
    use masterRESTORE DATABASE Layout 
      FROM DISK='%s' 
      WITH FILE=1, REPLACE, RECOVERY;因为运行场合较为简单,没有使用存储过程恢复数据了再次感谢各位的参与,散分
      

  5.   

    CSDN太慢了,昨天高峰时间就是登录不上为什么现在结贴给分了,页面上看不到。