ODAC (V9.5.15) 学习笔记(二十一)数据复制

用TVirtualTable在内存中缓存TOraQuery中的数据,主要应用场景是参照其他数据,需要将TOraQuery中的数据复制到TVirtualTable,由于没有类似于TClientDataSet的Data属性,所以只能考虑数据对拷。原来考虑的是通过数据流方式,采用:

ms := TMemoryStream.Create;
try
  OraQuery1.SaveToXML(ms);
  VirtualTable1.LoadFromStream(ms);
  VirtualTable1.Open;
finally
  ms.free;
end;

遇到中文内容时,个别情况下会触发解析异常错误,查看XML都很正常,就是有汉字而已,估计是编码问题处理的不好导致。并且字段属性没有被赋值过来,后来改成如下模式:

class function TPublicTools.CopyDataSet(ASourceDataSet : TOraDataSet;
  ADestDataSet : TVirtualTable): Boolean;
var
  i: Integer;
begin
  Result := False;
  if not (ASourceDataSet.Active and Assigned(ADestDataSet)) then
    Exit;
  //复制数据集 ,其实就这么简单
  ADestDataSet.Assign(ASourceDataSet);
  //开启内存表
  ADestDataSet.Open;
  //处理字段格式
  for i := 0 to ADestDataSet.Fields.Count -1 do
  begin
    ADestDataSet.Fields[i].Visible :=
      ASourceDataSet.FieldByName(ADestDataSet.Fields[i].FieldName).Visible;
    ADestDataSet.Fields[i].DisplayLabel :=
      ASourceDataSet.FieldByName(ADestDataSet.Fields[i].FieldName).DisplayLabel;
    ADestDataSet.Fields[i].DisplayWidth :=
      ASourceDataSet.FieldByName(ADestDataSet.Fields[i].FieldName).DisplayWidth;
    if ADestDataSet.Fields[i] is TFloatField then
      TFloatField(ADestDataSet.Fields[i]).DisplayFormat :=
        TFloatField(ASourceDataSet.FieldByName(ADestDataSet.Fields[i].FieldName)).DisplayFormat;
  end;
  Result := ADestDataSet.Active;
end;

直接用Assign来实现数据复制,效果很好,其实处理问题应该考虑简单点。

你可能感兴趣的:(学习笔记)