ClientDataSet同DataSet都是TdataSet:
使用TdatasetA.field.getdata 以及 TdatasetB.field.setdata
源代码如下:
Procedure RecordBatchMove(Source,Dest:TDataSet);//将源数据集的当前记录拷贝到目的数据集当前记录(目的数据集可写)
{ 目的:将源数据集中的数据更新拷贝(相当于BatchMove的AppendUpdate)到目标数据集;
前提条件:1、源数据集和目标数据集中的记录已经定位
2、目的数据集可写
工作原理:1、将源数据集(Source)中的数据定位到目标记录.
2、将目标数据集定位到相关记录:
2-1、在目标数据集删除相应的记录,
2-2、在目标数据集增加一条记录。
3、从源数据集中取出相关的记录。
4、遍历源数据集当前记录中的数据字段。
4-1、判断源数据集中当前数据字段的数据类型。
4-2、寻找目的数据集中的相关字段并将数据拷贝进入。
5、提交目的数据集。
}
const
FieldTypeNames: array[TFieldType] of string = (
'Unknown', 'String', 'SmallInt', 'Integer', 'Word', 'Boolean', 'Float',
'Currency', 'BCD', 'Date', 'Time', 'DateTime', 'Bytes', 'VarBytes',
'AutoInc', 'Blob', 'Memo', 'Graphic', 'FmtMemo', 'ParadoxOle',
'dBaseOle', 'TypedBinary', 'Cursor', 'FixedChar', 'WideString',
'LargeInt', 'ADT', 'Array', 'Reference', 'DataSet', 'OraBlob', 'OraClob',
'Variant', 'Interface', 'Dispatch', 'Guid');
var
stream:TMemoryStream;
i,MemSize:integer;
mybuffer
ointer;
Begin
with Source do
begin
stream :=TMemoryStream.Create;
for i:=0 to Source.FieldDefs.Count-1 do
begin //判断数据字段的类型
if not Source.Fields
.IsNull then
begin
if Source.Fields.DataType in [ftMemo] then //ftMemo
begin
stream.Clear;
((Source.Fields) as TMemoField).savetostream(stream);
stream.Position :=0;
((Dest.FieldByName(Source.Fields.FieldName)) as TMemoField).LoadFromStream(stream );
end
else if Source.Fields.DataType in [ftBlob] then //ftBlob
begin
stream.Clear;
((Source.Fields) as TBlobField).savetostream(stream);
stream.Position :=0;
((Dest.FieldByName(Source.Fields.FieldName)) as TBlobField).LoadFromStream(stream );
end
else if Source.Fields.DataType in [ftGraphic] then //ftGraphic
begin
stream.Clear;
((Source.Fields) as TGraphicField).savetostream(stream);
stream.Position :=0;
((Dest.FieldByName(Source.Fields.FieldName)) as TGraphicField).LoadFromStream(stream );
end
else//。。。。。。。。。。。。。。。。。。。。。。 其它任何字段类型
begin
MemSize:=Source.Fields.DataSize; //初始化内存。
GetMem(mybuffer,MemSize);
Source.Fields.GetData(mybuffer);
(Dest.FieldByName(Source.Fields.FieldName)).SetData(mybuffer);
FreeMem(mybuffer);
end;
end
else
Dest.FieldByName(Source.Fields.FieldName).Clear;
end; //判断数据字段的类型
stream.Free;
end;
end;