全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1035
推到 Plurk!
推到 Facebook!

数据库备份恢复问题

答題得分者是:cashxin2002
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-21 22:27:50 IP:222.184.xxx.xxx 未訂閱
以前别人给了我一套数据备份和恢复的代码,我单独运行成功的,但现在套用到自己的程序上来没有成功,我仔细分析了一下,好象有最主要的一点区别,就是人家给我的那个代码中的演示的数据库,他根本不和程序相连,而我自己的程序在启动一开始就要读数据库了,就是说在拷贝时当时数据库是在用的,我用备份时是成功的,因为是读了拷到另一个地方,用数据恢复时不能成功,(我自己估计是数据在读,所以不好覆盖)如果改成其它名字,则就能成功的恢复到当前应用程序的目录下,如果改成和原来名字一样的,那么也没什么提示错误,只是打开后还是原来的数据内容。请问我的分析是否对,如果对的话用什么方法暂时让数据库不在用,而让备份好的数据成功覆盖本数据库。
------
我的编程起步于ktop,我将永远支持ktop
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-22 12:58:08 IP:202.62.xxx.xxx 未訂閱
您好﹗    不知您是使用何種資料庫﹐小弟手上有個專案(ADO存取Access資料庫形態)﹐其中就有資料庫備份及恢复的部分﹐現將程式碼貼上﹐供您參考﹕
壓縮及備份部分﹕
Function TDataBRForm.CompactRepairData(soldMDB, snewMDB: String): Boolean;
Const
  SProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;';
Var
  OJetEng: JetEngine;
begin
  soldMDB := SProvider + 'Data Source=' + soldMDB
    + ';Jet OLEDB:Engine Type=5'
    + ';Jet OLEDB:Database Password=cashxinsheng';
  snewMDB := SProvider + 'Data Source=' + snewMDB
    + ';Jet OLEDB:Engine Type=5'
    + ';Jet OLEDB:Database Password=cashxinsheng';
  Try
    OJetEng := CoJetEngine.Create;
    OJetEng.CompactDatabase(soldMDB, snewMDB);
    OJetEng := Nil;
    Result := True;
  Except
    OJetEng := Nil;
    Result := False;
  end;
end;    procedure TDataBRForm.suiButton1Click(Sender: TObject);
Var
  MDB1, MDB2, BACKUPMDB, Str: String;
  I: Integer;
begin
  Label1.Caption := 'Compacting and Backuping Now ...';
  Label2.Caption := 'Please wait the moment!';
  suiPanel1.Pop;
  suiButton1.Enabled := False;
  suiButton2.Enabled := False;
  MDB1 := ExtractFilePath(Application.ExeName)+'Data\Salary.mdb';
  MDB2 := ExtractFilePath(Application.ExeName)+'Data\Temp.mdb';
  BACKUPMDB := ExtractFilePath(Application.ExeName) + 'Backup\';
  if FileExists(MDB1) then
    begin
      if Not CompactRepairData(MDB1, MDB2) then
        begin
          suiMessageDialog1.IconType := suiStop;
          suiMessageDialog1.Text := 'Compact and Backup Data was fail!';
          suiMessageDialog1.ShowModal;
        end
      else
        begin
          DeleteFile(MDB1);
          MoveFile(PChar(MDB2), PChar(MDB1));
          if suiInputDialog1.ShowModal = mrOK then
            begin
              DataBRForm.Update;
              Str := suiInputDialog1.ValueText;
              BACKUPMDB := BACKUPMDB + Str + '.mdb';
              CopyFile(PChar(MDB1), PChar(BACKUPMDB), False);
              suiMessageDialog1.IconType := suiInformation;
              suiMessageDialog1.Text := 'Compact and Backup Data was Complete!';
              suiMessageDialog1.ShowModal;
            end;
        end;
    end
  else
    begin
      suiMessageDialog1.IconType := suiStop;
      suiMessageDialog1.Text := 'Data File is not exist!';
      suiMessageDialog1.ShowModal;
    end;
  suiButton1.Enabled := True;
  suiButton2.Enabled := True;
  suiPanel1.Push;
  Label1.Caption := '';
  Label2.Caption := '';
  suiInputDialog1.ValueText := '';
end;    恢复部分﹕
procedure TDataBRForm.suiButton3Click(Sender: TObject);
Var
  oldMDB, newMDB, Str: String;
  I: Integer;
begin
  Label3.Caption := 'Restore Old Data Now ...';
  Label4.Caption := 'Please wait the moment!';
  suiPanel2.Pop;
  suiButton3.Enabled := False;
  oldMDB := ExtractFilePath(Application.ExeName) + 'Data\Salary.mdb';
  newMDB := ExtractFilePath(Application.ExeName) + 'Backup\';
  if suiInputDialog1.ShowModal = mrOK then
    begin
      DataBRForm.Update;
      Str := suiInputDialog1.ValueText;
      newMDB := newMDB + Str + '.mdb';
      if Not FileExists(newMDB) then
        begin
          suiMessageDialog1.IconType := suiStop;
          suiMessageDialog1.Text := Str + '.mdb is not exists!';
          suiMessageDialog1.ShowModal;
        end
      else
        begin
          CopyFile(PChar(newMDB), PChar(oldMDB), False);
          suiMessageDialog1.IconType := suiInformation;
          suiMessageDialog1.Text := 'Restore Data Complete!';
          suiMessageDialog1.ShowModal;
        end;
  end;
  suiButton3.Enabled := True;
  suiPanel2.Push;
  Label3.Caption := '';
  Label4.Caption := '';
  suiInputDialog1.ValueText := '';
end;
程式中以sui開頭的元件為小弟新增的第三方元件﹐您可替換成普通的元件來做 ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-22 18:30:16 IP:222.184.xxx.xxx 未訂閱
我又仔细测了一下,在XP下面备份和还原功能完全正常,只是在98下不能成功,但也无任何错误提示
------
我的编程起步于ktop,我将永远支持ktop
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-22 18:42:11 IP:202.62.xxx.xxx 未訂閱
您好﹗    如果是在98上運行的話﹐先更新98上的MDAC版本﹐或者在包裝的時候試試將ADO一起包裝進安裝程式﹐用來更新98上的MDAC﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
系統時間:2024-06-27 1:59:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!