mORMot虚拟数据集--TOrmTableDataSet

如何快速显示 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;
posted @ 2024-07-07 08:20  海利鸟  阅读(68)  评论(0编辑  收藏  举报