【问题标题】:how to copy a ftBlob with firedac arrayDML如何使用 fireac arrayDML 复制 ftBlob
【发布时间】:2017-06-08 09:21:14
【问题描述】:

我使用 Delphi Berlin。

我正在尝试使用 ArrayDML 将数据从 FireDac 查询(连接到数据库)复制到另一个 FireDac 查询(连接到另一个数据库)。第一个数据库是 firebird,另一个是 MSSQL,但在另一种情况下,两个数据库都是 Firebird。

到目前为止一切顺利,几乎所有数据类型都可以正常工作,除了 ftBlob。

这是函数的主体:

while not querySource.Eof do begin
  paramPosition := -1;
  Inc(mIndex);

  for i := 0 to querySource.FieldCount - 1 do begin
    Inc(paramPosition);
    // daca exista o valoare
    if querySource.FieldByName(querySource.Fields[i].FieldName).AsVariant <> Null then begin
      case querySource.Fields[i].DataType of
        ftDateTime, ftDate, ftTime, ftTimeStamp : queryInsert.Params[paramPosition].AsDateTimes[mIndex] := querySource.FieldByName(querySource.Fields[i].FieldName).AsDateTime;
        ftFloat, ftCurrency, ftBCD, ftFMTBcd    : queryInsert.Params[paramPosition].AsFloats[mIndex]    := querySource.FieldByName(querySource.Fields[i].FieldName).AsFloat;
        ftSmallint, ftInteger, ftLargeint       : queryInsert.Params[paramPosition].AsIntegers[mIndex]  := querySource.FieldByName(querySource.Fields[i].FieldName).AsInteger;
        ftString                                : queryInsert.Params[paramPosition].AsStrings[mIndex]   := querySource.FieldByName(querySource.Fields[i].FieldName).AsString;
        ftBlob, ftMemo, ftGraphic               : queryInsert.Params[paramPosition].AsBlobs[mIndex]     := querySource.FieldByName(querySource.Fields[i].FieldName).AsVariant;
      end;
    end;
  end;

blob 值未从源中复制正确的值。

在这种情况下如何使用arrayDML?有什么解决办法吗?

【问题讨论】:

  • 尝试使用AsAnsiString 而不是AsVariant。或致电AssignFieldValue,因为我在您的代码中没有看到 DML 数组的好处。或者忘记这一切并使用现成的解决方案:)
  • 我没有使用过arrayDML,但我确信这不是处理blob的方法。看看您需要如何以 Delphi 处理 blob 的方式处理它们 - docwiki.embarcadero.com/RADStudio/Tokyo/en/…。还可以查看来自 embarcadero docwiki.embarcadero.com/CodeExamples/Tokyo/en/… 的 TFDQuery 批处理示例
  • @RBA,DML 索引参数AsBlobs 期望与AsBlob 相同。
  • @Victoria - 我没有使用过 DML,但是使用经典数据集,您不能使用 dataset1.fieldbyname('field').asBlob 将数据集的 blob 值分配给另一个数据集:= dataset2.fieldbyname('anotherfield').asblob,对吧?
  • @RBA,这里有两个不同的类,扩展的TFDParam 和普通的TField(其中TField 没有任何类型的AsBlob 属性;TFDParam 有@987654334 @ 方法,正如我在第一条评论中所说,但它不适用于 DML 数组)。

标签: delphi firedac


【解决方案1】:

我不会回答你的问题,但建议你使用TFDBatchMove 组件,因为你在这里重新发明轮子。 TFDBatchMove 仅用于您想做的事情,用于将数据从一个数据库移动到另一个数据库(不仅如此)。

您只需将TFDBatchMoveSQLReader 设置为ReaderWriter,为两者编写SQL 查询,组件将通过匹配名称自动映射字段。如果查询没有匹配的字段名称,您可以通过 Mappings 属性对其进行微调。然后你只需拨打Execute

【讨论】:

  • 知道答案。作为COPY工作正常。但我不能让它像 AppendUpdate 一样工作。你能给我一个“真实且有效”的教程吗?到目前为止,在这方面我找不到任何可以帮助我的人。
  • “作为副本”是什么意思?您的意思是当Mode 属性设置为dmAppendUpdate 时您遇到了一些问题?如果是这样,请确保您的表具有主键字段?
  • 两个表具有相同的 PK。 IDINTEGER NOT NULL 主键。是的 dmAppendUpdate 是问题所在。在第一次运行模式 = dmAppendUpdate 工作正常,因为 dest 表是空的。但在第二次运行时会引发 pk 违规。
  • 这不应该发生。这不只是您将其视为调试器对话框的已处理异常吗?
  • 不。也可以帮助查看组件创建的日志。*************** Start Log 12.06.2017 11:02:51 AM ************* ** [FireDAC][Phys][FB] 违反表“TEMP_1”上的 PRIMARY 或 UNIQUE KEY 约束“INTEG_38” 有问题的键值是(“ID”= 1)插入到 TEMP_1(ID,DETAILS)值(:NEW_ID, :NEW_DETAILS) *************** 结束日志 12.06.2017 11:02:51 AM ***************
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2013-08-08
  • 2012-09-08
相关资源
最近更新 更多