事情是这样的 我做一个人事管理系统 d7+sql2000
现在做到了一个块 数据库备份和还原 备份正常 还原有问题
因为一进入这个系统 就当然要进行数据库的连接 我的连接用的是
datamodule1.ADOConnection1 (用adoconnection连接的) 现在的情况是
如果我删除了ADOConnection1  或者是把ADOConnection1的初始属性connected 设为false
connectsting 设为'' 数据库就可以正常还原 不过除还原外的其他模块也就用不了了
于是我就想 在初始状态下呢 设置ADOConnection1的初始属性connected 设为true
在还原时将其关闭(也就是切断数据库 只有切断才能还原)
我的语句如下:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  datamodule1.ADOConnection1.Connected := False;
  datamodule1.ADOConnection1.ConnectionString:='';
  datamodule1.ADOConnection1.close;//以上这几条断库语句有问题 实际上他无法彻底,完全,干脆的关闭数据库cre_peo_ma
  ADOQuery1.Close; 
  ADOQuery1.ConnectionString:= 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master';
  try
    with ADOQuery1 do
    begin
      Close;
      SQL.Clear;
     SQL.Add('restore database cre_peo_ma from disk = ''c:\ jj.bak'''); //要还原数据库 cre_peo_ma 从 ''c:\ jj.bak'' 
      ExecSQL;
    end;
    ShowMessage('还原成功。');
  except
    On e: exception do
    ShowMessage('还原失败。');
  end;
  datamodule1.ADOConnection1.open;
end;现在问题是 我的datamodule1.ADOConnection1.close; 或是datamodule1.ADOConnection1.Connected := False;有问题 他不能彻底关闭或是断开数据库cre_peo_ma
一旦执行还原就提示“数据库连接被使用 无法使用还原” 
请大家帮我想想用个语句怎么样彻底与数据库断开
当然还原后 还因该可以再连上 谢谢

解决方案 »

  1.   


    : zjcxc(邹建) ( ) 信誉:316 
    /*
    关闭用户打开的进程处理
    */
    use master
    goif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_killspid]
    GOcreate proc p_killspid
    @dbname varchar(200) --要关闭进程的数据库名
    as  
    declare @sql  nvarchar(500)  
    declare @spid nvarchar(20) declare #tb cursor for
    select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
    open #tb
    fetch next from #tb into @spid
    while @@fetch_status=0
    begin  
    exec('kill '+@spid)
    fetch next from #tb into @spid
    end  
    close #tb
    deallocate #tb
    go--用法  
    exec p_killspid  '数据库名'
    =======================================================
    用的delphi执行上面的脚本之后,在使用restore命令恢复
      

  2.   

    jinjazz(近身剪(N-P攻略)) 谢谢你
     不过还是想请你把上面的语句进行解释一下
    我是很菜的 请说的最好详细些 谢谢
      

  3.   

    jinjazz给的是一个存储过程。。你在数据库中新建一存储过程。。然后命名p_killspid调用这个存储过程就行了
      

  4.   

    DM.Sta_MonthTicketDB.Connected := False;
      MySQL := 'ALTER DATABASE station_monthticket SET OFFLINE WITH ROLLBACK IMMEDIATE'; //关闭数据库
      with QueryRestor do
      begin
        Close;
        SQL.Clear;
        SQL.Text := MySQL;
        try
          ExecSQL;
        except    end;
      end;
      RestorStr := 'RESTORE DATABASE Station_Monthticket FROM DISK = ''' + DataPath+ ''' WITH REPLACE';
      with QueryRestor do
      begin
        Close;
        SQL.Clear;
        SQL.Text := RestorStr;
        try
          ExecSQL;
          Application.MessageBox('恢复数据库成功!','提示!',mb_ok+mb_iconinformation);
          a1.Active:=false;
          self.Caption:=application.Title+'-备份与恢复';
        except
          Application.MessageBox('恢复数据库出错!','错误!',mb_ok+mb_iconError);
        end;
      end;
      MySQL := 'ALTER DATABASE Station_Monthticket SET ONLINE WITH ROLLBACK IMMEDIATE';
      with QueryRestor do
      begin
        Close;
        SQL.Clear;
        SQL.Text := MySQL;
        try
          ExecSQL;
        except    end;
      end;
      DM.Sta_MonthTicketDB.Connected := True;这是我一个管理软件..BDE+SQL 2000的还原代码...
      

  5.   

    那么麻烦干吗
    比如你要还原的数据库叫DB1,那么你用cn这个对象连接了DB1,要执行还原语句之前呢,你写一个cn.execute('use master'),然后执行还原的操作,保证你还原的没问题。
    之所以connected=false不能完全关闭连接,是因为你设成false之后,SQL并不立刻断开你的连接,所以还原时会被认为还在使用中。删除也是如此,一定要把连接到要删除的数据库的所有连接都use master一下,不然一定删除不了!!!
      

  6.   

    你先把datamodule1.free再创建一个ADOCOMMAND,指向数据库服务(注意:不要连接到库,不然还是断不掉的)
    就是这句  ADOQuery1.ConnectionString:= 'Provider=SQLOLEDB.1;Persist Security Info=False;User 
    ID=sa;Initial Catalog=master';我是这样写的
    adorestore.ConnectionString:=' Provider=SQLOLEDB.1;'+'Persist Security Info=False;User ID='+GetRegInfo(3)+';Password='+GetRegInfo(4)+';'+
                      'Data Source='+GetRegInfo(1);
    你自己改一下就可以了,GetRegInfo(3)='sa',GetRegInfo(4)=密码,GetRegInfo(1)=服务器名
    下面这个是我以前做的原码:参考一下可能有用
    procedure TForm1.suiButton17Click(Sender: TObject);
    var adorestore:TAdocommand;
    begin
     if suiEdit6.Text='' then
     begin
     Application.MessageBox('请选择恢复文件!','提示',64);
     exit;
     end;
      if application.MessageBox('此操作将使上次备份以来的所有数据丢失,是否继续?','恢复数据',33)=IDCANCEL then  exit;
             dm.Free;//这个就是数据模块的释放
             adorestore:=TAdocommand.Create(application);
             adorestore.ConnectionString:=' Provider=SQLOLEDB.1;'+'Persist Security Info=False;User ID='+GetRegInfo(3)+';Password='+GetRegInfo(4)+';'+
                      'Data Source='+GetRegInfo(1);
             adorestore.CommandText:='restore database MMDATA from disk='''+suiEdit6.Text+''' with replace';
             try
              adorestore.Execute;
              adorestore.Free;
              if Application.MessageBox( '恢复成功! 现在需要重新登陆软件,请按“确定” ','提示',64)=IDOK then Close;
             except
              Application.MessageBox('恢复失败!请确认恢复文件的路径和名称是否正确,或是否已关闭其它正在使用此数据库的程序!','提示',64);
              adorestore.Free;
              exit;
             end;//end tryend;
      

  7.   

    to  aus(天兵)  
    cn.execute('use master') 是什么意思 如果说是释放数据库的话 我试过了 没有用的
      

  8.   

    create proc p_killspid,这个存储过程就可以了。
      

  9.   

    to zdq801104(我很笨,但是我不傻!) 
    毛病依旧 还是不行阿 我都快崩溃了 怎么就是断不了呢?
      

  10.   

    怎么在delphi里调用存储过程呢
      

  11.   

    恢复前:ALTER DATABASE 数据库名 SET OFFLINE WITH ROLLBACK IMMEDIATE恢复数据库恢复后:ALTER DATABASE 数据库名 SET ONLINE WITH ROLLBACK IMMEDIATE
      

  12.   

    ADOQuery1.SQL.Add('use master');
    ADOQuery1.SQL.Add(''restore database MMDATA from disk='''+suiEdit6.Text+''' with replace');
    ADOQuery1.ExecSQL;调用存储过程:
    ADOQuery1.SQL.Add('execute 存储过程名 参数1,参数2,...');
    ADOQuery1.ExecSQL;
      

  13.   

    你留个联系方式,我帮你改,TND,我不信真有那么难?