我想在程序中提供数据库备份和还原的功能,备份过程可以在连接数据库时进行,还原过程必须断开与数据库的连接,但用断开连接命令一定要等待近一分钟时间才能真正断开与数据库的连接,在这过程中进行还原操作就会报错,我试过在还原操作前加一段代码,让程序等待一分钟继续进行,但提示执行过程超时。下面是我的部分源代码,请指点:     //释放所有窗体
     if form2<>nil then
       begin
         form2.Free;
         form2:=nil;
       end;
     if form3<>nil then
       begin
         form3.Free;
         form3:=nil;
       end;
     ... ...     //释放连接 ADOConnection1连接需要还原的数据库
     form1.ADOConnection1.Close;
     form1.ADOConnection1.Free;
     form1.ADOConnection1:=nil;     form1.ADOConnection2.BeginTrans;
     try
       str='restore database from disk='''+edit1.text+''' with replace';
       form1.ADOConnection2.Execute(str);  //报错
       form1.ADOConnection2.CommitTrans;
       showmessage('数据库还原成功!');
     except
       form1.ADOConnection2.RollbackTrans;
       showmessage('还原失败');
     end;

解决方案 »

  1.   

    参考:
    unit dbopr;interfaceuses windows, forms;type
      TDBBack = function(dbname, username, passwd, dirc, timestamp: pchar): Integer; stdcall;
      TDBRest = function(dbname, username, passwd, dirc: pchar): Integer; stdcall;function backdb(dbname, username, passwd, dirc, timestamp: pchar): integer;
    function restdb(dbname, username, passwd, dirc: pchar): integer;implementation
    function backdb(dbname, username, passwd, dirc, timestamp: pchar): integer;
    var
      DBBack: TDBBack;
      VL_HDL: integer;
    begin
      Result := -1;
      VL_Hdl := LoadLibrary('database.dll');
      if VL_Hdl >= 32 then
      begin
        @DBBack := GetProcAddress(VL_Hdl, 'backdb');
        if (@DBBack = nil) then
        begin
          Application.MessageBox('函数调用失败!某些管理将无法进行。请与系统管理员联系!', '提示信息', mb_OK or mb_ICONEXCLAMATION);
        end
        else
        begin
          Result := DBBack(dbname, username, passwd, dirc, timestamp);
        end;
      end;
    end;function restdb(dbname, username, passwd, dirc: pchar): integer;
    var
      DBRest: TDBRest;
      VL_HDL: integer;
    begin
      Result := -1;
      VL_Hdl := LoadLibrary('database.dll');
      if VL_Hdl >= 32 then
      begin
        @DBRest := GetProcAddress(VL_Hdl, 'restdb');
        if (@DBRest = nil) then
        begin
          Application.MessageBox('函数调用失败!某些管理将无法进行。请与系统管理员联系!', '提示信息', mb_OK or mb_ICONEXCLAMATION);
        end
        else
        begin
          Result := DBRest(dbname, username, passwd, dirc);
        end;
      end;
    end;end.
      

  2.   

    你用的是sql server的话,可以考虑直接调用服务器提供的dos命令来执行。
    关于这个问题在MS的sql server2000管理员手册中有比较完整的说明。
      

  3.   

    jiezhi(西域浪子) 兄是不是用来database.dll来完成?这个dll呢?