首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中有一种使用FireDAC备份和恢复数据库的方法

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

Stack Overflow用户
提问于 2017-03-28 02:56:18
回答 1查看 6.9K关注 0票数 2

有使用FireDAC备份和恢复数据库的方法吗?

我使用Delphi10.1柏林并连接到MSSQL。理想情况下,它会备份数据库中所有有趣的属性(记录、索引等),但是一个只做数据备份和恢复的解决方案会很好(我可以在恢复之前重新创建所有元数据)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-28 18:12:28

我承认我对您的Q有点困惑,因为答案似乎太简单了,即使用FireDAC的TDFConnection来执行SqlServer TransactSql脚本来备份和恢复数据库。我希望你不要认为那是欺骗;)

示例项目代码

代码语言:javascript
复制
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;

显然,这对错误检查有点轻描淡写,但我相信你会明白的。

在逐步淘汰之前,我将使用Delphi自动化对SqlServer的Sql库进行此操作,因为实现进度回调(如"% completed“)很容易。

我还没有成功地使用Delphi的Sql_DOM的后继者SMO做任何有用的事情,最近我使用的是TADOConnection而不是FireDAC,这只是因为获得数据库列表所涉及的负担较少,而ADO错误集合提供了一种简单的方法来获取遇到的任何错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43059879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档