基于数据模型的序列
基于数据模型的序列
大家知道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;
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/16223270.html