mORMot虛擬資料集--TOrmTableDataSet

海利鸟發表於2024-07-07

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

相關文章