回 帖 发 新 帖 刷新版面

主题:我现在用Delphi+SQL恢复数据库时出问题,谁助?

我在备份可以成功完成,但恢复的时候总是报错。我关闭了所有的数据控件,但还是不行,程序如下:(望大家指教,再线顾盼!)
procedure TFrmdataback.RecoverDataClick(Sender: TObject);
var DataPath: string;
begin
  self.Caption := '正在恢复数据....';
  adodm.hotelconn.Close;
  adodm.hotelconn.Connected := false;
  adodm.backconn.open;
  adodm.backconn.Connected :=true;
  OpenDialog1.Filter := '备份文件 (*.back)|*.back|所有文件 (*.*)|*.*'; //设置备份文件后缀
  OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName) + '\backupdata';
  //设置备份路径
  if OpenDialog1.Execute then
    DataPath := OpenDialog1.FileName;
  if DataPath <> '' then
  begin
    if application.MessageBox('此操作将使上次备份以来的所有数据丢失,是否继续?', '恢复数据', MB_OKCANCEL) = idOK then
    begin
      a1.Active := true;
      adodm.cback.CommandText := 'restore database hotel from disk=''' + DataPath + '''' + ' with replace'; //恢复数据命令语句
      try
        try
          adodm.cback.Execute;
          //执行恢复过程
          MessageBox(0,' 恢复成功!','',MB_OK+MB_ICONINFORMATION);
        except
          showmessage('数据库正在被使用!请确定已关闭其它使用该数据库程序!');
          MessageBox(0,'恢复失败!','',MB_OK+MB_ICONINFORMATION);
        end;
      finally
        a1.Active := false;
        try
        // 打开各个数据表是否有错误
          adodm.Tuser.Open;
          adodm.Toprator.Open;
          adodm.Trate.Open;
          adodm.Troomset.Open;
          adodm.Troomtype.Open;
          adodm.Tcusbook.Open;
        except
          showmessage('程序运行发生不可预知错误,请重新启动程序!');
          //结束该程序
          Application.Terminate;
        end;
      end;
    end;
  end;
  end;

回复列表 (共8个回复)

沙发


这是我的程序中用到的备份和还原!你参考下
unit BackUp_Form;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TFlatGaugeUnit, StdCtrls, TFlatEditUnit, ExtCtrls,FileCtrl;

type
  TBackup_F = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ZT_FE: TFlatEdit;
    JD_FG: TFlatGauge;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Backup_F: TBackup_F;

implementation

{$R *.dfm}

Uses
  ExtIniFiles,StrUtils;

function GetFileNum(dir:string):integer;
var
  sr:Tsearchrec;
begin
  result:=0;
  if findfirst(dir,faanyfile,sr)=0 then
    repeat
      if(sr.Attr<>fadirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
        result:=result+1;
    until findnext(sr)<>0;
end;
//***********************************************************************************
procedure Wait(second:Longint);
var
  FirstTickCount:longint;
begin
  FirstTickCount:=GetTickCount;
  repeat
    Application.ProcessMessages;
  until ((GetTickCount-FirstTickCount) >=second);
end;
//***********************************************************************************
procedure TBackup_F.Timer1Timer(Sender: TObject);
var
  myini:TExtIniFile;
  cz,num:integer;
  spath,dpath,name,RQ:string;
  sr:Tsearchrec;
  StartupInfo:TStartupInfo;
  ProcessInfo:TProcessInformation;
begin
  Timer1.Enabled:=false;
  myini:=TExtIniFile.Create(ExtractFilePath(Application.ExeName)+'set.ini');
  cz:=myini.ReadInteger('bakup','CZ',0);
  if cz=0 then
    begin
      spath:=ExtractFilePath(Application.ExeName)+'Data';
      dpath:=myini.ReadString('bakup','BakPath','');
      dpath:=dpath+'\'+AnsiReplaceStr(DateTimeToStr(now),':','');
      ForceDirectories(dpath);
      num:=GetFileNum(spath+'\*.*');
      ZT_FE.Text:='正在备份数据库......';
      JD_FG.MaxValue:=num;
      if findfirst(spath+'\*.*',faanyfile,sr)=0 then
        repeat
          if(sr.Attr<>fadirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
            begin
              copyfile(pchar(spath+'\'+sr.Name),pchar(dpath+'\'+sr.Name),false);
              JD_FG.Progress:=JD_FG.Progress+1;
            end;
          Wait(100);
        until findnext(sr)<>0;
      ZT_FE.Text:='数据库备份成功';
      MessageBox(handle,'恭喜你:数据库备份成功!','祝贺你',MB_OK or MB_ICONINFORMATION);
    end
    else begin
      RQ:=myini.ReadString('bakup','RQ','');
      spath:=myini.ReadString('bakupdian',RQ,'');
      spath:=spath+'\'+RQ;
      dpath:=ExtractFilePath(Application.ExeName);
      dpath:=dpath+'Data';
      num:=GetFileNum(spath+'\*.*');
      ZT_FE.Text:='正在还原数据库......';
      JD_FG.MaxValue:=num;
      if findfirst(spath+'\*.*',faanyfile,sr)=0 then
        repeat
          if(sr.Attr<>fadirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
            begin
              copyfile(pchar(spath+'\'+sr.Name),pchar(dpath+'\'+sr.Name),false);
              JD_FG.Progress:=JD_FG.Progress+1;
            end;
          Wait(100);  
        until findnext(sr)<>0;
      ZT_FE.Text:='数据库还原成功';
      MessageBox(handle,'恭喜你:数据库还原成功!','祝贺你',MB_OK or MB_ICONINFORMATION);
    end;
  StartupInfo.cb:=sizeof(StartupInfo);
  FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  CreateProcess(pchar(ExtractFilePath(Application.ExeName)+'TSGL.exe'),nil,nil,nil,false,0,nil,nil,StartupInfo,ProcessInfo);
  close;
end;

end.

板凳

谢谢海角天涯大哥。

3 楼

您的程序太复杂,我是个初学者看不太懂。您可以帮我改改我的程序吗?

4 楼

以上的两种方法我想其实都可以完全数据库的备份与还原的!数据库的备份是很好实现的,相对来说数据库还原比较麻烦一些。因为你在还原的时候,首先要保证要还原的数据库已经没有被使用,否则会提示错误“数据库已被使用,未能取得它的排它权”
以上是小弟实践得出的结论! 现将自己的代码贴出来冲公!
Unit BackRestoreSQLDB;
  {描述:SQL SERVER 2000 数据库备份与恢复单元 ,本单元函数在SQL SERVER 2000 +Delphi7.0编译通过
  
  }
interface

uses
  adodb,db;
function repl_substr(sub_old, sub_new, s: string): string; //把sub_old换成sub_new,后面有用。
function BackupSQLDataBase(connstr_sql,DatabaseName,Backup_FileName:string):Boolean;//数据库备份函数
//SQL数据数据库备份,connstr_sql是ADO控件的connectionstring,DatabaseName是数据库名称,
//Backup_FileName要备份到的目 标文件
function RestoreSQLDataBase(connstr_sql,DatabaseName,Restore_FileName:string):Boolean;//数据库恢复函数
//Restore_FileName以前备份的数据库文件,
implementation

function repl_substr(sub_old, sub_new, s: string): string;
var
  i: integer;
begin
  repeat
    i := pos(sub_old, s);
    if i > 0 then
    begin
      delete(s, i, Length(sub_old));
      insert(sub_new, s, i);
    end;
  until i < 1;
  Result := s;
end;
function BackupSQLDataBase(connstr_sql,DatabaseName,Backup_FileName:string):Boolean;
var
//备份SQL数据库SQL数据数据库备份,connstr_sql是ADO控件的connectionstring,DatabaseName是数据库名称,
//Backup_FileName要备份到的目标文件
aADOQuery:TADOQuery;
begin
try
  aADOQuery:=TADOQuery.Create(nil);
  aADOQuery.Close;
  aADOQuery.ConnectionString:=connstr_sql;
  aADOQuery.SQL.Clear;
  aADOQuery.SQL.Add('backup database '+DatabaseName+' to disk = ' + '''' + Backup_FileName + ''' with format');
  Try
    aADOQuery.ExecSQL;
  Result:=true;
  Except
    Result:=false;
   exit;
  end;
finally
  aADOQuery.Free;
end;
end;
function RestoreSQLDataBase(connstr_sql,DatabaseName,Restore_FileName:string):Boolean;
var//数据库恢复函数,estore_FileName以前备份的数据库文件
aADOQuery:TADOQuery;
begin
try
  aADOQuery:=TADOQuery.Create(nil);
  aADOQuery.Close;//恢复数据库不能打开数据库,要打开系统数据库master,把连接字符串如adoconnetion的connectionstring中的数据库名称换成"master"数据库
  aADOQuery.ConnectionString:=repl_substr(DatabaseName,'master',connstr_sql);
  aADOQuery.SQL.Clear;
  aADOQuery.SQL.Add('RESTORE DATABASE '+DatabaseName+' from disk = ' + '''' + Restore_FileName + '''');
Try
    aADOQuery.ExecSQL;
  Result:=true;
Except
    Result:=false;
   exit;
  end;
finally
  aADOQuery.Free;
end;
end;
end.

5 楼

第四楼的楼主,我好好的看了你的程序,你的程序我调试过,好象还有一小点问题.你是不是可以把备份和恢复的顺序定一下,我写了,问题就没有了,谢谢!

6 楼

写个存储过程就行了

7 楼

写个存储过程就行了

8 楼

Mark!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册