Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中,有没有一种使用FireDAC备份和恢复数据库的方法_Delphi_Firedac_Delphi 10.1 Berlin - Fatal编程技术网

在Delphi中,有没有一种使用FireDAC备份和恢复数据库的方法

在Delphi中,有没有一种使用FireDAC备份和恢复数据库的方法,delphi,firedac,delphi-10.1-berlin,Delphi,Firedac,Delphi 10.1 Berlin,有没有办法使用FireDAC备份和恢复数据库 我正在使用Delphi10.1并连接到MSSQL服务器。理想情况下,它将备份数据库所有有趣的属性(记录、索引等),但只备份和恢复数据的解决方案就可以了(我可以在恢复之前重新创建所有元数据)。我承认我对你的问题有点困惑,因为答案似乎有点太简单了,即 使用FireDAC的TDFConnection执行SqlServer Transact-SQL脚本以备份和恢复数据库。我希望你不要认为那是作弊;) 示例项目代码 type TForm1 = class(

有没有办法使用FireDAC备份和恢复数据库


我正在使用Delphi10.1并连接到MSSQL服务器。理想情况下,它将备份数据库所有有趣的属性(记录、索引等),但只备份和恢复数据的解决方案就可以了(我可以在恢复之前重新创建所有元数据)。

我承认我对你的问题有点困惑,因为答案似乎有点太简单了,即 使用FireDAC的
TDFConnection
执行SqlServer Transact-SQL脚本以备份和恢复数据库。我希望你不要认为那是作弊;)

示例项目代码

type
  TForm1 = class(TForm)
    FDConnection1: TFDConnection;
    btnBackUp: TButton;
    btnRestore: TButton;
    FDMetaInfoQuery1: TFDMetaInfoQuery;
    FDPhysMSSQLDriverLink1: TFDPhysMSSQLDriverLink;
    DBGrid1: TDBGrid;  //  connected to DataSource1
    DataSource1: TDataSource;  // connected to FDMetaInfoQuery1
    Memo1: TMemo;
    procedure btnBackUpClick(Sender: TObject);
    procedure btnRestoreClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  [...]

const
  scBackUpPath = 'D:\MSSql2014\Backup\';
  scBackupExtn = '.Bak';

procedure TForm1.Log(const Msg : String);
begin
  Memo1.Lines.Add(Msg);
end;

function TForm1.DatabaseName: String;
begin
  Result := FDMetaInfoQuery1.FieldByName('Catalog_Name').AsString;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDMetaInfoQuery1.MetaInfoKind := mkCatalogs;  // gets list of databases
  FDConnection1.Connected := True;
end;

procedure TForm1.BackupDB(const DBName: String);
var
  FileName,
  Sql : String;
begin
  FileName := scBackUpPath + DBName + scBackUpExtn;
  Sql := 'backup database %s to disk = ''%s''';
  Sql := Format(Sql, [DBName, FileName]);
  Log('Backing up ' + DBName + ' using SQL: ' + Sql);
  try
    Screen.Cursor := crHourGlass;
    Update;
    FDConnection1.ExecSQL(Sql);
    Log('Done');
  finally
    Screen.Cursor := crDefault;
  end;
end;

procedure TForm1.btnBackUpClick(Sender: TObject);
begin
  BackUpDB(DatabaseName);
end;

procedure TForm1.btnRestoreClick(Sender: TObject);
begin
  RestoreDB(DatabaseName);
end;

procedure TForm1.RestoreDB(const DBName: String);
var
  FileName,
  Sql : String;
begin
  FileName := scBackUpPath + DBName + scBackUpExtn;
  if FileExists(FileName) then begin
    //  Note:  beware the 'with replace' in the following
    Sql := 'restore database %s from disk = ''%s'' with replace';
    Sql := Format(Sql, [DBName, FileName]);
    Log('Restoring ' + DBName + ' using SQL: ' + Sql);
    try
      Screen.Cursor := crHourGlass;
      Update;
      FDConnection1.ExecSQL(Sql);
      Log('Done');
    finally
      Screen.Cursor := crDefault;
    end;
  end
  else
    Log('Backup file ' + FileName + ' not found!');
end;
显然,这对错误检查来说有点轻,但我相信你会明白的

在它被淘汰之前,我会使用DelphiAutomation对SqlServer的SQLDMO库进行升级 这样做是因为很容易实现进度回调,如“%completed”

对于Sql_DOM的继承者,来自Delphi的SMO,我还没有做任何有用的事情 这些天我会用TADOConnection而不是FireDAC来做这件事,如果有的话 因为获取数据库列表和
ADO Errors collection提供了一种获取遇到的任何错误的简单方法。

这不是一项在it级别处理的数据库管理任务吗?为什么要在德尔福完成?备份通常在实际服务器本身上完成。将所有数据泵送到DB客户端将消耗大量资源,几乎没有任何好处。如果您希望使用更轻的软件,请切换到其他软件,例如带有客户机/服务器REST层的SQLite3:备份这样的数据库很容易—您只需复制文件或使用其备份API即可。@ArnaudBouchez,我的一位客户在交付的每台机器上都分发MSSQL Express。当其他客户端从不同的机器访问此服务器时,还有一个主/服务器应用程序与SQL server运行在同一系统上。最好直接在这个应用程序中实现备份和恢复机制。目前,我们通过执行对流程控制较少的外部应用程序来解决这个问题。顺便说一句,切换到另一个数据库在这里是没有选择的。@ArnaudBouchez这是一个桌面软件,大多数用户将在他们的机器上运行服务器(express)(单用户或小型网络安装),而其他用户将连接到一个合适的服务器(公司安装)。这似乎工作得很好。由于数据库相对较小(低于100MB),我可能无法继续生活下去,因此应该快速备份和恢复。“我已经设法用Sql_DOM的继承者,来自Delphi的SMO做了任何有用的事情”,SMO仅用于.NET,因此您必须为它编写一个包装器。虽然这是一个很好的提示@维多利亚。谢谢,我知道SMO需要一个包装,所以我没有费心去做任何事情。我以前使用DMO的唯一原因是,人们可以轻松地在长时间的操作中获得进度回调,我不想为了让SMO正常工作而跳槽,结果却发现它们存在一些停秀问题。