mORMot假造数据集--TOrmTableDataSet

梦应逍遥  金牌会员 | 2024-7-7 06:36:11 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 581|帖子 581|积分 1743

怎样快速显示 OrmTable--可以使用TOrmTableDataSet

这是mormot.db.rad.ui.orm的重要功能
  1. type
  2.   /// 只读虚拟TDataSet,能够访问TOrmTable
  3.   TOrmTableDataSet = class(TVirtualDataSet)
  4.   protected
  5.     fTable: TOrmTable;  // 关联的TOrmTable实例
  6.     {$ifndef UNICODE}  // 如果不是在Unicode版本的Delphi中
  7.     fForceWideString: boolean;  // 强制使用WideString字段代替AnsiString
  8.     {$endif UNICODE}
  9.     fTableShouldBeFreed: boolean;  // 指示TOrmTable实例是否应该随此数据集一起释放
  10.     fTempBlob: RawBlob;  // 临时Blob存储
  11.     procedure InternalInitFieldDefs; override;  // 初始化字段定义
  12.     function GetRecordCount: integer; override;  // 获取记录数
  13.     function GetRowFieldData(Field: TField; RowIndex: integer;
  14.       out ResultLen: integer; OnlyCheckNull: boolean): pointer; override;  // 获取行字段数据
  15.     function SearchForField(const aLookupFieldName: RawUtf8;
  16.       const aLookupValue: variant; aOptions: TLocateOptions): integer; override;  // 搜索字段
  17.   public
  18.     /// 使用提供的TOrmTable初始化虚拟TDataSet
  19.     // - 警告:除非设置了TableShouldBeFreed属性为true或使用了CreateOwnedTable()构造函数,否则提供的TOrmTable实例在返回的TOrmTableDataSet实例被使用时必须始终可用
  20.     // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  21.     // - TDataSet在创建时将被打开
  22.     constructor Create(Owner: TComponent; OrmTable: TOrmTable {$ifndef UNICODE}; ForceWideString: boolean = false{$endif}); reintroduce;
  23.   
  24.     /// 初始化拥有TOrmTable的虚拟TDataSet
  25.     // - 此构造函数将设置TableShouldBeFreed为TRUE
  26.     // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  27.     // - TDataSet在创建时将被打开
  28.     constructor CreateOwnedTable(Owner: TComponent; OrmTable: TOrmTable  {$ifndef UNICODE}; ForceWideString: boolean = false{$endif}); reintroduce;
  29.   
  30.     /// 从提供的JSON结果初始化虚拟TDataSet
  31.     // - 此构造函数将解析提供的JSON内容,并创建一个内部的TOrmTableJson实例来处理数据,根据JSON内容猜测列类型
  32.     // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  33.     // - TDataSet在创建时将被打开
  34.     constructor CreateFromJson(Owner: TComponent; const Json: RawUtf8 {$ifndef UNICODE}; ForceWideString: boolean = false{$endif}); reintroduce; overload;
  35.   
  36.     /// 从提供的JSON结果初始化虚拟TDataSet,并设置预期的列类型
  37.     // - 此构造函数将解析提供的JSON内容,并根据列类型创建内部的TOrmTableJson实例来处理数据
  38.     // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  39.     // - TDataSet在创建时将被打开
  40.     constructor CreateFromJson(Owner: TComponent; const Json: RawUtf8;
  41.       const ColumnTypes: array of TOrmFieldType
  42.       {$ifndef UNICODE}; ForceWideString: boolean = false{$endif});
  43.         reintroduce; overload;
  44.   
  45.     /// 从提供的JSON ORM结果初始化虚拟TDataSet
  46.     // - 可以设置TOrm类以检索预期的列类型
  47.     // - 此构造函数将解析提供的JSON内容,并创建一个内部的TOrmTableJson实例来处理数据
  48.     // - 在非Unicode版本的Delphi中,可以设置ForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  49.     // - TDataSet在创建时将被打开
  50.     constructor CreateFromJson(Owner: TComponent; const Json: RawUtf8; const Tables: array of TOrmClass {$ifndef UNICODE}; ForceWideString: boolean = false{$endif});  reintroduce; overload;
  51.   
  52.     /// 销毁类实例
  53.     destructor Destroy; override;
  54.     /// 如果提供的TOrmTable实例应该随此类一起释放
  55.     // - Create()将默认设置为FALSE(意味着TOrmTable实例在TOrmTableDataSet实例被使用时必须始终可用)
  56.     // - CreateOwnedTable()将在TOrmTableDataSet实例释放时设置并释放TOrmTable实例
  57.     // - 您也可以在Create()之后手动设置此属性
  58.     property TableShouldBeFreed: boolean  read fTableShouldBeFreed write fTableShouldBeFreed;
  59.     /// 访问内部的TOrmTable/TOrmTableJson数据
  60.     // - 您可以使用例如SortFields()方法
  61.     // - 如果列保持不变,您可以动态更改表内容
  62.     property Table: TOrmTable  read fTable write fTable;
  63.   end;
  64. {************ JSON/ORM 到 TDataSet 包装函数 }
  65. type
  66.   /// 存储低级别DB.pas字段信息
  67.   // - 由GetDBFieldDef()和GetDBFieldValue()函数使用
  68.   TDBFieldDef = record
  69.     FieldName: string;  // 字段名
  70.     DBType: TFieldType;  // 字段类型
  71.     DBSize: integer;  // 字段大小
  72.     SqlType: TOrmFieldType;  // SQL字段类型
  73.     SqlIndex: integer;  // SQL索引
  74.     FieldType: POrmTableFieldType;  // 字段类型指针
  75.   end;
  76. /// 获取低级别DB.pas字段信息
  77. // - 准备添加到TDataSet中,如:aDataSet.FieldDefs.Add(FieldName,DBType,DBSize);
  78. procedure GetDBFieldDef(aTable: TOrmTable; aField: integer; out DBFieldDef: TDBFieldDef {$ifndef UNICODE}; aForceWideString: boolean = false{$endif});
  79. /// 填充DB.pas字段内容
  80. // - 例如,由mormot.db.rad.ui.cds.pas中的ToClientDataSet()使用
  81. procedure GetDBFieldValue(aTable: TOrmTable; aRow: integer; aField: TField; aDataSet: TDataSet; const DBFieldDef: TDBFieldDef);
  82. /// 将JSON结果转换为TDataSet,从JSON中猜测字段类型
  83. // - 此函数是TOrmTableDataSet.CreateFromJson()的包装器
  84. // - 在非Unicode版本的Delphi中,可以设置aForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  85. // - 在Unicode版本的Delphi(2009+)中,将使用string/UnicodeString
  86. function JsonToDataSet(aOwner: TComponent; const aJson: RawUtf8 {$ifndef UNICODE}; aForceWideString: boolean = false{$endif}): TOrmTableDataSet;overload; {$ifdef HASINLINE} inline;{$endif}
  87. /// 将JSON ORM结果转换为TDataSet,遵循TOrm字段类型
  88. // - 此函数是TOrmTableDataSet.CreateFromJson()的包装器
  89. // - 在非Unicode版本的Delphi中,可以设置aForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  90. // - 在Unicode版本的Delphi(2009+)中,将使用string/UnicodeString
  91. function JsonTableToDataSet(aOwner: TComponent; const aJson: RawUtf8; const Tables: array of TOrmClass {$ifndef UNICODE}; aForceWideString: boolean = false{$endif}): TOrmTableDataSet;
  92. /// 将JSON结果转换为TDataSet,并给定一组列类型
  93. // - 此函数是TOrmTableDataSet.CreateFromJson()的包装器
  94. // - 在非Unicode版本的Delphi中,可以设置aForceWideString以强制使用WideString字段代替AnsiString(如果需要)
  95. // - 在Unicode版本的Delphi(2009+)中,将使用string/UnicodeString
  96. function JsonToDataSet(aOwner: TComponent; const aJson: RawUtf8; const ColumnTypes: array of TOrmFieldType {$ifndef UNICODE}; aForceWideString: boolean = false{$endif}): TOrmTableDataSet;overload;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表