【发布时间】: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 数组)。