zoukankan      html  css  js  c++  java
  • 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来实现数据复制,效果很好,其实处理问题应该考虑简单点。

  • 相关阅读:
    重装Win10系统的非常简单的操作教程
    Python
    Delphi
    Libs
    Windows Server
    Windows Server
    Delphi
    Delphi
    Delphi
    Delphi
  • 原文地址:https://www.cnblogs.com/ChinaEHR/p/4536721.html
Copyright © 2011-2022 走看看