如何使用 firedac arrayDML 复制 ftBlob
how to copy a ftBlob with firedac arrayDML
我用Delphi柏林。
我正在尝试 function/procedure 使用 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?任何解决方法?
我不会回答你的问题,但建议你使用 TFDBatchMove component because you are reinventing wheel here. TFDBatchMove 只是为了你想做的事情,将数据从一个数据库移动到另一个数据库(不仅如此)。
您只需设置 TFDBatchMoveSQLReader as Reader and Writer, write SQL queries for both and the component will automatically map the fields by matching names. If the queries won't have matching field names, you can fine tune this by the Mappings property. Then you just call Execute。
我用Delphi柏林。
我正在尝试 function/procedure 使用 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?任何解决方法?
我不会回答你的问题,但建议你使用 TFDBatchMove component because you are reinventing wheel here. TFDBatchMove 只是为了你想做的事情,将数据从一个数据库移动到另一个数据库(不仅如此)。
您只需设置 TFDBatchMoveSQLReader as Reader and Writer, write SQL queries for both and the component will automatically map the fields by matching names. If the queries won't have matching field names, you can fine tune this by the Mappings property. Then you just call Execute。