在Delphi中,有没有一种使用FireDAC备份和恢复数据库的方法
有没有办法使用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(
我正在使用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正常工作而跳槽,结果却发现它们存在一些停秀问题。