Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Mysql 使用TFDBatchMove复制数据库:如何设置从时间戳到整数的转换?_Mysql_Sqlite_Delphi_Firedac_Delphi 10.3 Rio - Fatal编程技术网

Mysql 使用TFDBatchMove复制数据库:如何设置从时间戳到整数的转换?

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

我的程序应该能够在脱机模式下工作,而无需连接到远程MySQL数据库。为此,我想创建一个选项,将特定表下载到本地SQLite数据库,并在工作完成后将其重新加载回服务器。我尝试使用TFDBatchMove组件来完成此任务

该解决方案适用于除一个字段外的所有字段:MySQL TIMESTAMP。当前本地数据库使用整数存储时间戳。当我将数据从SQLite复制到MySQL时,我得到一个错误。在反向操作上,时间戳已损坏

我想我需要某种类型的数据映射,但我还没有找到如何设置它。有人能帮忙吗

错误消息:“Project VRDB.exe引发异常类EVariantError,并显示消息‘无效的变量类型转换’”。Project VRDB.exe引发异常类EDatabaseError,消息为“字段“TimeStamp”“的值无效”

我的测试代码:

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>];