Mysql 使用TFDBatchMove复制数据库:如何设置从时间戳到整数的转换?
我的程序应该能够在脱机模式下工作,而无需连接到远程MySQL数据库。为此,我想创建一个选项,将特定表下载到本地SQLite数据库,并在工作完成后将其重新加载回服务器。我尝试使用TFDBatchMove组件来完成此任务 该解决方案适用于除一个字段外的所有字段:MySQL TIMESTAMP。当前本地数据库使用整数存储时间戳。当我将数据从SQLite复制到MySQL时,我得到一个错误。在反向操作上,时间戳已损坏 我想我需要某种类型的数据映射,但我还没有找到如何设置它。有人能帮忙吗 错误消息:“Project VRDB.exe引发异常类EVariantError,并显示消息‘无效的变量类型转换’”。Project VRDB.exe引发异常类EDatabaseError,消息为“字段“TimeStamp”“的值无效” 我的测试代码:Mysql 使用TFDBatchMove复制数据库:如何设置从时间戳到整数的转换?,mysql,sqlite,delphi,firedac,delphi-10.3-rio,Mysql,Sqlite,Delphi,Firedac,Delphi 10.3 Rio,我的程序应该能够在脱机模式下工作,而无需连接到远程MySQL数据库。为此,我想创建一个选项,将特定表下载到本地SQLite数据库,并在工作完成后将其重新加载回服务器。我尝试使用TFDBatchMove组件来完成此任务 该解决方案适用于除一个字段外的所有字段:MySQL TIMESTAMP。当前本地数据库使用整数存储时间戳。当我将数据从SQLite复制到MySQL时,我得到一个错误。在反向操作上,时间戳已损坏 我想我需要某种类型的数据映射,但我还没有找到如何设置它。有人能帮忙吗 错误消息:“Pro
procedure TForm1.ButtonDownloadDBClick(Sender: TObject);
var queryFrom, queryTo: TFDQuery;
FDBatchMove: TFDBatchMove;
begin
queryFrom := TFDQuery.Create(nil);
queryTo := TFDQuery.Create(nil);
FDBatchMove := TFDBatchMove.Create(nil);
with FDBatchMove do begin
// Use "always insert record" mode
Mode := dmAlwaysInsert;
// Erase destination dataset before moving data
Options := [poClearDest];
end;
try
queryFrom.Connection := FDConnection2; //MySQL
queryTo.Connection := FDConnection1; //SQLite
queryFrom.SQL.Clear;
queryFrom.SQL.Add('SELECT * FROM Clients');
queryFrom.Open();
queryFrom.Prepare;
queryFrom.Close;
queryTo.SQL.Clear;
queryTo.SQL.Add('SELECT * FROM Clients');
queryTo.Open();
queryTo.Prepare;
queryTo.Close;
with TFDBatchMoveDataSetReader.Create(FDBatchMove) do begin
DataSet := queryFrom;
Optimise := False;
end;
with TFDBatchMoveDataSetWriter.Create(FDBatchMove) do begin
DataSet := queryTo;
Optimise := False;
end;
FDBatchMove.Execute;
finally
queryFrom.Close;
queryFrom.Destroy;
queryTo.Close;
queryTo.Destroy;
FDBatchMove.Destroy;
end;
end;
看来我已经解决了这个问题。我就是这样做的。我假设时间戳字段在MySQL中是
TimeStamp
,在SQLite中是INTEGER
,并且DateTimeFormat=String
非常感谢布莱恩的想法
您应该修改来自SQL的查询。对于MySQL->SQLite,请执行以下操作:
queryFrom.SQL.Add('SELECT ID,Phone,Name,<...>,UNIX_TIMESTAMP(TimeStamp) FROM Clients');
queryFrom.SQL.Add('SELECT ID,Phone,Name,<...>,datetime(TimeStamp, "unixepoch") FROM Clients');
另一个重要提示:由于某种原因,我无法让它工作。如果有人知道如何正确地映射函数列,请回复这篇文章,我将添加配方
我的测试代码中也有一个错误。如您所见,我希望保持我的ID值,即主键
值与原来完全相同。如果需要,必须在BatchMove中指定poIdentityInsert
:
FDBatchMove.Options:=[poIdentityInsert,];
在另一种情况下,您将获得一个错误的
Fetch命令Fetch[0],而不是[1]记录。
错误。一个选项是修改From
查询以对相关字段进行转换。Wierd,但如果我尝试从客户端选择ID、Name、…、UNIX\u时间戳(TIMESTAMP)代码>BatchMove返回无法将类型(UnicodeString)的变量转换为类型(Integer)
错误。无法使其工作FDBatchMove.Mappings.Add
没有帮助。要么我做了一些非常错误的事情,要么SELECT中用作BatchMove数据源的函数不受支持。有人可以调查一下吗?
queryFrom.SQL.Add('SELECT ID,Phone,Name,<...>,strftime("%d.%m.%Y %H:%M:%S", TimeStamp, "unixepoch") FROM Clients');
FDBatchMove.Options := [poIdentityInsert, <OtherOptions>];