用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来实现数据复制,效果很好,其实处理问题应该考虑简单点。