基于数据模型的序列

基于数据模型的序列

大家知道delphi用TDataset(数据集)来封装数据表操作,简单而方便。但其实也可以基于数据模型(db-model)来封装数据表,而且数据模型也可能封装其它非SQL数据。

基于数据模型的序列也是目前主流语言所选择支持的方式,支持跨平台、跨语言。

废话不多说,上代码示例。

基于数据模型JSON序列

定义《计量单位》数据模型

type
  TErr = record
    ok: Boolean;
    err: string;
  end;

  TUnit = record
    unitId: string;
    unitName: string;
  end;

序列《计量单位》为JSON

function unitsQry(url: string; body: rawbytestring): string;
// /rest/unit/qry/{dbid}
var
  db: tdb;
  pool: tdbpool;
  jo: tjsonobject;
  arr: tarray<string>;
  s: TJsonSerializer;
  dw: tunit;
  dws: tarray<tunit>;
  i: Integer;
  err: terr;
begin
  jo := TJSONObject.Create;
  s := TJsonSerializer.Create;
  try
    try
      arr := url.Split(['/']);
      pool := GetDBPool(arr[4]);
      db := pool.Lock;
      db.qry.Close;
      db.qry.SQL.Clear;
      db.qry.SQL.Text := 'select top 100 * from tunit';
      db.qry.Open;
      SetLength(dws, db.qry.RecordCount);
      db.qry.First;
      i := 0;
      while not db.qry.Eof do
      begin
        dw.unitId := db.qry.FieldByName('unitid').AsString;
        dw.unitName := db.qry.FieldByName('unitname').AsString;
        dws[i] := dw;
        inc(i);
        db.qry.Next;
      end;
      Result := s.Serialize<TArray<TUnit>>(dws);
    except
      on E: Exception do
      begin
        err.ok := False;
        err.err := e.Message;
        Result := s.Serialize<TErr>(err);
      end;
    end;
  finally
    pool.Unlock(db);
    jo.Free;
    s.Free;
  end;
end;

基于数据模型protobuf(二进制)序列

定义《计量单位》数据模型

type
  TErr = record
    [Serialize(1)]
    ok: Boolean;
    [Serialize(2)]
    err: string;
  end;

  TUnits = record
    [Serialize(1)]
    unitid: string;
    [Serialize(2)]
    unitname: string;
  end;

  TUnitss = record
    [Serialize(1)]
    UnitsArr: TArray<TUnits>;
  end;

序列《计量单位》为protobuf

function unitsQry(url: string; body: rawbytestring): tbytes;
// /protobuf/unit/qry/{dbid}
var
  db: tdb;
  pool: tdbpool;
  pb: TgoProtocolBuffer;
  arr: tarray<string>;
  dw: TUnits;
  dws: tunitss;
  i: integer;
  err: TErr;
begin
  pb := TgoProtocolBuffer.Create;
  try
    try
      arr := url.Split(['/']);
      pool := GetDBPool(arr[4]);
      db := pool.Lock;
      db.qry.Close;
      db.qry.SQL.Clear;
      db.qry.SQL.Text := 'select top 100 * from tunit';
      db.qry.Open;
      SetLength(dws.UnitsArr, db.qry.RecordCount);
      db.qry.First;
      i := 0;
      while not db.qry.Eof do
      begin
        dw.unitid := db.qry.FieldByName('unitid').AsString;
        dw.unitname := db.qry.FieldByName('unitname').AsString;
        dws.UnitsArr[i] := dw;
        inc(i);
        db.qry.Next;
      end;
      Result := pb.Serialize<tunitss>(dws);
    except
      on E: Exception do
      begin
        err.ok := False;
        err.err := e.Message;
        Result := pb.Serialize<TErr>(err);
      end;
    end;
  finally
    pool.Unlock(db);
    pb.Free;
  end;
end;

 

posted @ 2022-05-05 08:27  delphi中间件  阅读(185)  评论(0编辑  收藏  举报