首页 > 其他分享 >mORMot虚拟数据集--TOrmTableDataSet

mORMot虚拟数据集--TOrmTableDataSet

时间:2024-07-07 09:09:38浏览次数:7  
标签:TOrmTableDataSet const -- mORMot TOrmTable 字段 boolean TDataSet

如何快速显示 OrmTable--可以使用TOrmTableDataSet

这是mormot.db.rad.ui.orm的主要功能

type
  /// 只读虚拟TDataSet,能够访问TOrmTable
  TOrmTableDataSet = class(TVirtualDataSet)
  protected
    fTable: TOrmTable;  // 关联的TOrmTable实例
    {$ifndef UNICODE}  // 如果不是在Unicode版本的Delphi中
    fForceWideString: boolean;  // 强制使用WideString字段代替AnsiString
    {$endif UNICODE}
    fTableShouldBeFreed: boolean;  // 指示TOrmTable实例是否应该随此数据集一起释放
    fTempBlob: RawBlob;  // 临时Blob存储
    procedure InternalInitFieldDefs; override;  // 初始化字段定义
    function GetRecordCount: integer; override;  // 获取记录数
    function GetRowFieldData(Field: TField; RowIndex: integer;
      out ResultLen: integer; OnlyCheckNull: boolean): pointer; override;  // 获取行字段数据
    function SearchForField(const aLookupFieldName: RawUtf8;
      const aLookupValue: variant; aOptions: TLocateOptions): integer; override;  // 搜索字段
  public
    /// 使用提供的TOrmTable初始化虚拟TDataSet
    // - 警告:除非设置了TableShouldBeFreed属性为true或使用了CreateOwnedTable()构造函数,否则提供的TOrmTable实例在返回的TOrmTableDataSet实例被使用时必须始终可用
    // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
    // - TDataSet在创建时将被打开
    constructor Create(Owner: TComponent; OrmTable: TOrmTable {$ifndef UNICODE}; ForceWideString: boolean = false{$endif}); reintroduce;
  
    /// 初始化拥有TOrmTable的虚拟TDataSet
    // - 此构造函数将设置TableShouldBeFreed为TRUE
    // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
    // - TDataSet在创建时将被打开
    constructor CreateOwnedTable(Owner: TComponent; OrmTable: TOrmTable  {$ifndef UNICODE}; ForceWideString: boolean = false{$endif}); reintroduce;
  
    /// 从提供的JSON结果初始化虚拟TDataSet
    // - 此构造函数将解析提供的JSON内容,并创建一个内部的TOrmTableJson实例来处理数据,根据JSON内容猜测列类型
    // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
    // - TDataSet在创建时将被打开
    constructor CreateFromJson(Owner: TComponent; const Json: RawUtf8 {$ifndef UNICODE}; ForceWideString: boolean = false{$endif}); reintroduce; overload;
  
    /// 从提供的JSON结果初始化虚拟TDataSet,并设置预期的列类型
    // - 此构造函数将解析提供的JSON内容,并根据列类型创建内部的TOrmTableJson实例来处理数据
    // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
    // - TDataSet在创建时将被打开
    constructor CreateFromJson(Owner: TComponent; const Json: RawUtf8;
      const ColumnTypes: array of TOrmFieldType
      {$ifndef UNICODE}; ForceWideString: boolean = false{$endif});
        reintroduce; overload;
  
    /// 从提供的JSON ORM结果初始化虚拟TDataSet
    // - 可以设置TOrm类以检索预期的列类型
    // - 此构造函数将解析提供的JSON内容,并创建一个内部的TOrmTableJson实例来处理数据
    // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
    // - TDataSet在创建时将被打开
    constructor CreateFromJson(Owner: TComponent; const Json: RawUtf8; const Tables: array of TOrmClass {$ifndef UNICODE}; ForceWideString: boolean = false{$endif});  reintroduce; overload;
  
    /// 销毁类实例
    destructor Destroy; override;

    /// 如果提供的TOrmTable实例应该随此类一起释放
    // - Create()将默认设置为FALSE(意味着TOrmTable实例在TOrmTableDataSet实例被使用时必须始终可用)
    // - CreateOwnedTable()将在TOrmTableDataSet实例释放时设置并释放TOrmTable实例
    // - 您也可以在Create()之后手动设置此属性
    property TableShouldBeFreed: boolean  read fTableShouldBeFreed write fTableShouldBeFreed;
    /// 访问内部的TOrmTable/TOrmTableJson数据
    // - 您可以使用例如SortFields()方法
    // - 如果列保持不变,您可以动态更改表内容
    property Table: TOrmTable  read fTable write fTable;
  end;

{************ JSON/ORM 到 TDataSet 包装函数 }

type
  /// 存储低级别DB.pas字段信息
  // - 由GetDBFieldDef()和GetDBFieldValue()函数使用
  TDBFieldDef = record
    FieldName: string;  // 字段名
    DBType: TFieldType;  // 字段类型
    DBSize: integer;  // 字段大小
    SqlType: TOrmFieldType;  // SQL字段类型
    SqlIndex: integer;  // SQL索引
    FieldType: POrmTableFieldType;  // 字段类型指针
  end;

/// 获取低级别DB.pas字段信息
// - 准备添加到TDataSet中,如:aDataSet.FieldDefs.Add(FieldName,DBType,DBSize);
procedure GetDBFieldDef(aTable: TOrmTable; aField: integer; out DBFieldDef: TDBFieldDef {$ifndef UNICODE}; aForceWideString: boolean = false{$endif});

/// 填充DB.pas字段内容
// - 例如,由mormot.db.rad.ui.cds.pas中的ToClientDataSet()使用
procedure GetDBFieldValue(aTable: TOrmTable; aRow: integer; aField: TField; aDataSet: TDataSet; const DBFieldDef: TDBFieldDef);

/// 将JSON结果转换为TDataSet,从JSON中猜测字段类型
// - 此函数是TOrmTableDataSet.CreateFromJson()的包装器
// - 在非Unicode版本的Delphi中,可以设置aForceWideString以强制使用WideString字段代替AnsiString(如果需要)
// - 在Unicode版本的Delphi(2009+)中,将使用string/UnicodeString
function JsonToDataSet(aOwner: TComponent; const aJson: RawUtf8 {$ifndef UNICODE}; aForceWideString: boolean = false{$endif}): TOrmTableDataSet;overload; {$ifdef HASINLINE} inline;{$endif}

/// 将JSON ORM结果转换为TDataSet,遵循TOrm字段类型
// - 此函数是TOrmTableDataSet.CreateFromJson()的包装器
// - 在非Unicode版本的Delphi中,可以设置aForceWideString以强制使用WideString字段代替AnsiString(如果需要)
// - 在Unicode版本的Delphi(2009+)中,将使用string/UnicodeString
function JsonTableToDataSet(aOwner: TComponent; const aJson: RawUtf8; const Tables: array of TOrmClass {$ifndef UNICODE}; aForceWideString: boolean = false{$endif}): TOrmTableDataSet;

/// 将JSON结果转换为TDataSet,并给定一组列类型
// - 此函数是TOrmTableDataSet.CreateFromJson()的包装器
// - 在非Unicode版本的Delphi中,可以设置aForceWideString以强制使用WideString字段代替AnsiString(如果需要)
// - 在Unicode版本的Delphi(2009+)中,将使用string/UnicodeString
function JsonToDataSet(aOwner: TComponent; const aJson: RawUtf8; const ColumnTypes: array of TOrmFieldType {$ifndef UNICODE}; aForceWideString: boolean = false{$endif}): TOrmTableDataSet;overload;

标签:TOrmTableDataSet,const,--,mORMot,TOrmTable,字段,boolean,TDataSet
From: https://www.cnblogs.com/hieroly/p/18288178

相关文章

  • 文本中的特殊字符
    常用希腊文小写字母的输入,包括α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω。希腊字母:ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζνξοπρσηθικλμτυφχψω¥§°≈√∵≥×÷特殊......
  • ---
    前言仔细想来,上了十年学,好像还从来没有过正经自己写一篇文章。这么多年,文章无一例外的都是为完成任务而写,于我而言大多还带着痛苦。在我即将步入大学之时,语文这门课也将走出我的学习生活,带走了困扰,但又似乎留下了某种遗憾。以前的我从不相信各种神奇的情感,什么喜极而泣,只是考场......
  • Denso Create Programming Contest 2024(AtCoder Beginner Contest 361)
    DensoCreateProgrammingContest2024(AtCoderBeginnerContest361)\(A\)Insert\(AC\)循环结构。点击查看代码inta[200];intmain(){intn,k,x,i;cin>>n>>k>>x;for(i=1;i<=n;i++){cin>>a[i];cout......
  • 浅谈进程隐藏技术
    前言在之前几篇文章已经学习了解了几种钩取的方法●浅谈调试模式钩取● 浅谈热补丁● 浅谈内联钩取原理与实现● 导入地址表钩取技术这篇文章就利用钩取方式完成进程隐藏的效果。进程遍历方法在实现进程隐藏时,首先需要明确遍历进程的方法。CreateToolhelp32Snapshot......
  • 中山市选 #E 参数拟合
    中山市选#E参数拟合题目大意有两个长度为\(n\)的序列\(A,B\)。现在给出你\(m\)种操作,\((u,v)\)表示你可以将\(A_u,A_v\)同时增加\(q\)为任意整数。最后需要使得\(\sum(A_i-B_i)^2\)最小。解题思路首先,我们令\(C_i=A_i-B_i\)这样我们的目标就是使得\(\s......
  • 剪映PC电脑版开心版5.5.0免VIP导出补丁下载_替换一次即可长期使用
    剪映5.5.0免VIP导出补丁来了,可以使用VIP特效,文字转语音声效,滤镜,等全部需要VIP的素材,都可以直接导出,不需要VIP并且是需要替换一次,每次启动软件都是可以直接导出的,只要不重新安装剪映,都是可以使用的补丁对应版本:5.5.0(不是5.5.0版本会出现闪退)补丁安全无毒无广告使用教程:打开......
  • SQL Server 2022 中的 Tempdb 性能改进非常显著
    无论是在我的会话中还是在我写的博客中,Tempdb始终是我的话题。然而,当谈到SQLServer2022中引入的重大性能变化时,我从未如此兴奋过。他们解决了我们最大的性能瓶颈之一,即系统页面闩锁并发。在SQLServer2019中,他们通过引入内存优化的tempdb解决了所谓的元数据争用......
  • Blazor SPA 的本质是什么以及服务器端渲染如何与 Blazor 的新 Web 应用程序配合使用
    Blazor通常被称为单页应用程序(SPA)框架。当我第一次开始使用Blazor时,我对SPA的含义、组件如何为SPA架构做出贡献以及所有这些如何与交互性联系在一起感到困惑。今天,我将解答大家可能关心的三个问题:什么是SPA?了解所有新的“BlazorWebApp”模板。是什么使Blaz......
  • NET 中的 12 个简单干净代码技巧
    编写干净的代码对于可维护性、可读性和可扩展性至关重要。这里有12个简单的技巧可以帮助您在.Net中编写更干净的代码,每个技巧都附有好的和坏的代码片段。1.使用有意义的名字糟糕的代码publicclassC{publicvoidM(){vara=10;var......
  • java内存管理机制垃圾回收的详细说明
    前言在前面三篇文章中,对JVM的内存布局、内存分配、垃圾标记做了较多的介绍,垃圾都已经标记出来了,那剩下的就是如何高效的去回收啦!这篇文章将重点介绍如何回收旧手机、电脑、彩电、冰箱~啊呸(⊙o⊙)…将重点介绍几种垃圾回收算法、HotSpot中常用的垃圾收集器的主要特点和应用场......