梦应逍遥 发表于 2024-7-7 06:36:11

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: booleanread fTableShouldBeFreed write fTableShouldBeFreed;
    /// 访问内部的TOrmTable/TOrmTableJson数据
    // - 您可以使用例如SortFields()方法
    // - 如果列保持不变,您可以动态更改表内容
    property Table: TOrmTableread 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;
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: mORMot假造数据集--TOrmTableDataSet