mORMot虚拟数据集--TOrmTableDataSet

海利鸟 2024-07-07 08:39:00 阅读 69

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

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

<code>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;



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。