在我恢复备份的时候,总是提示我,数据库正在使用!
我用
restore database恢复!
能不能通过代码把数据库(MyServer)关闭掉?
怎么实现?

解决方案 »

  1.   

    把你的业务数据库相连的adoconnection1.close;
    用另外一个adoconnection2连接数据库master,执行备份EXEC sp_addumpdevice 'disk', 'MyNwind_1', 
       DISK ='c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_1.dat'-- Back up the full MyNwind database.
    BACKUP DATABASE MyNwind TO MyNwind_1
      

  2.   

    光关闭连接是不够的,必须停止sql server的服务或者短开数据文件的连接才可以拷贝,备份等工作
      

  3.   

    如: lion_lh(xmanx) 所说!!!先关掉连接数据库的组件就行了呗!!组件.close!
      

  4.   

    通过master数据库来恢复你的数据库是最简单的办法!即在master数据库执行还原命令!
      

  5.   

    To lion_lh:
      你说的我看不大明白,可否解释一下!或者将备份恢复的完整代码贴出来?你的方法可以关闭掉名为myServer数据库吗?To gardenyang:
      如果我停止了SQLServer,我的备份恢复如何执行?To whiteiger8:
      组件.close不可行!如果我通过企业管理器或者查询分析器正在使用某数据库,该怎么办?
      

  6.   

    To zhenpengka:
      我知道如何备份和恢复!假如我在恢复数据库时,使用查询分析器或者企业管理器正在对该数据库进行操作,恢复时,会提示该数据库正在使用,我想通过代码把该库关闭掉,然后执行恢复数据库代码!我的问题是如何关闭该库(通过代码),可能沃问题表达的不够清楚!抱歉!
      

  7.   

    这个问题我碰见过,给一个完美解决方案
    上面很多大哥说关闭数据控件( .close),呵呵,各位作过没有阿?不行的,SQLserver里面关闭数据控件后连接还是没断开,状态为sleeping,各位可以通过SP_Who验证一下,
    还有大哥说use master,呵呵,这个我不敢说一定不行,但至少我用这种方法,程序中没有报错了,看上去也是在恢复(时间上),但是恢复完毕看了一下数据库,啥都没恢复出来,虽然没有报错(未出现什么数据库正在被占用的异常)了完美解决:
    在恢复前先执行下面这段存储过程,注意这段存储过程要放在Master下!!
    CREATE Procedure killspid (@dbname varchar(50))
    as
    begin
    declare @sql nvarchar(500)
    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<>-1
    begin
    exec('kill '+@spid)
    fetch next from getspid into @spid
    end
    close getspid
    deallocate getspid
    end这段存储过程是关闭当前数据库的所有连接,执行完后就可以进行恢复操作了,
    这种方法一点问题都没有!!!
      

  8.   

    再贴段代码给你ado连sqlserver,Connection是连你数据库的ADOConnction控件,SPConnection是连master的控件,SP为存储过程空间,其connection属性是SPConnection
    try 
       Connection.Connected:=false;
       Connection.close;
       // 在master里建一个存储过程 killspid
       SPConnection.open
       SP.Close;
       SP.ProcedureName:='killspid';
       SP.Parameters.Refresh;
       SP.Parameters.ParamByName('@dbname').Value:=你的数据库名称
       SP.ExecProc;
       with BakQuery do
       begin
         close;
         SQl.Clear;
         SQl.Append('USE master');
         SQL.Append('RESTORE DATABASE 你的数据库名称 FROM '+备份点名称);
         SQL.Append('WITH FILE = 1 ');
         EXECSQL;
      end;
     
        Connection.Connected:=true;
        SPConnection.Close;
        MEssagedlg('恢复成功!!',mtinformation,[mbok],0);  except
        Connection.Connected:=true;
        SPConnection.Connected:=false;
        Messagedlg('恢复失败!!',mterror,[mbok],0);
      end;
      

  9.   

    再次感谢!~分送的有点慢了!那是因为,我不知道存储过程怎么执行的结果!不过看了半天的sql server的帮助,已经解决了!
    揭帖!