如何快速顯示 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;