Delphi 如何使用firedac arrayDML复制ftBlob

Delphi 如何使用firedac arrayDML复制ftBlob,delphi,firedac,Delphi,Firedac,我使用德尔福柏林 我正在尝试使用ArrayDML创建一个函数/过程,将数据从一个FireDac查询(连接到数据库)复制到另一个FireDac查询(连接到另一个数据库)。第一个数据库是firebird,另一个是first care中的MSSQL,但在另一种情况下,两个数据库都是firebird 到目前为止,一切都很好,除了ftBlob之外,几乎所有的数据类型都正常工作 以下是函数的主体: while not querySource.Eof do begin paramPosition := -

我使用德尔福柏林

我正在尝试使用ArrayDML创建一个函数/过程,将数据从一个FireDac查询(连接到数据库)复制到另一个FireDac查询(连接到另一个数据库)。第一个数据库是firebird,另一个是first care中的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;
而不是querySource.Eof do begin
参数位置:=-1;
mIndex公司;
对于i:=0到querySource.FieldCount-1,不开始
公司(高级职位);
//达卡埃希斯塔瓦洛雷酒店
如果querySource.FieldByName(querySource.Fields[i].FieldName).AsVariant为空,则开始
case querySource.Fields[i]。的数据类型
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].AssString[mIndex]:=querySource.FieldByName(querySource.Fields[i].FieldName).AssString;
ftBlob,ftMemo,ftGraphic:queryInsert.Params[paramPosition].asblob[mIndex]:=querySource.FieldByName(querySource.Fields[i].FieldName).AsVariant;
结束;
结束;
结束;
blob值不是从源复制的正确值


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

我不会回答您的问题,但建议您使用该组件,因为您正在重新发明轮子。只是为了您想做的事情,将数据从一个数据库移动到另一个数据库(不仅仅是这样)


您只需设置as和,为两者编写SQL查询,组件就会通过匹配名称自动映射字段。如果查询没有匹配的字段名,可以通过属性对此进行微调。然后你只需打电话。

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



您只需设置as和,为两者编写SQL查询,组件就会通过匹配名称自动映射字段。如果查询没有匹配的字段名,可以通过属性对此进行微调。然后您只需调用。

尝试使用
asansisting
而不是
AsVariant
。或者调用,因为我在代码中没有看到DML数组的好处。或者忘记这一切,使用现成的解决方案:)我没有使用arrayDML,但我确信这不是处理blob的方法。看看您需要如何以Delphi处理BLOB的方式来处理BLOB-。还可以查看embarcadero@RBA中的TFDQuery批处理示例,DML索引参数
AsBlob
期望与
AsBlob
@Victoria相同-我没有使用过DML,但使用clasic数据集,您无法通过使用dataset1将blob值分配给另一个数据集。fieldbyname('field')。AsBlob:=dataset2.fieldbyname('anotherfield').asblob,对吗?@RBA,这里有两个不同的类,extended
TFDParam
和common
TField
(其中
TField
没有任何类型的
asblob
属性;
TFDParam
AssignFieldValue
方法,正如我在第一条评论中所说的,但它不用于DML数组)。尝试使用
AsAnsiString
而不是
AsVariant
。或者调用,因为我在您的代码中看不到DML数组的好处。或者忘记这一切,使用现成的解决方案:)我没有使用arrayDML,但我确信这不是处理BLOB的方法。看看您需要如何以Delphi处理BLOB的方式来处理BLOB-。还可以查看embarcadero@RBA中的TFDQuery批处理示例,DML索引参数
AsBlob
期望与
AsBlob
@Victoria相同-我没有使用过DML,但使用clasic数据集,您无法通过使用dataset1将blob值分配给另一个数据集。fieldbyname('field')。AsBlob:=dataset2.fieldbyname('anotherfield').asblob,对吗?@RBA,这里有两个不同的类,extended
TFDParam
和common
TField
(其中
TField
没有任何类型的
asblob
属性;
TFDParam
AssignFieldValue
方法,正如我在第一条评论中所说的,但它不用于DML数组).tks作为答案。作为副本可以正常工作。但是我不能让它作为AppendUpdate工作。你能给我一个“真实且有效”的教程吗?到目前为止,我在这方面找不到任何帮助。你说的“作为副本”是什么意思?您的意思是当属性设置为
dmAppendUpdate
时出现一些问题吗?如果是,请确保您的表具有主键字段?两个表具有相同的主键。IDINTEGER NOT NULL主键。是的,问题在于dmAppendUpdate。在第一次运行时,模式=dmAppendUpdate工作正常,因为dest表为空空。但在第二次运行时,会引发pk冲突。这不应该发生。这不只是作为调试器对话框处理的异常吗?不,如果有助于查看组件创建的日志。*******************启动日志12.06.2017 11:02:51 AM************************[FireDAC][Phys][FB在表“TEMP_1”中,有问题的键值是(“ID”=1)插入TEMP_1(ID,DETAILS)值(:NEW_ID,:NEW_DETAILS)****************************结束日志12.06.2017 11:02:51 AM**********************tks以获取答案。作为副本工作正常。但我不能