api.clientdataset.pas
api.clientdataset.pas
unit api.clientdataset; // clientdataset CRUD // cxg 2024-12-6 interface uses // mormot------ mormot.core.variants, // system--------- Classes, SysUtils, // my-------- db.firedac, db.firedacpool, keyValue.serialize, sys.global; type Tcds = record // 查询 function select(ctxt: Tcontext): cardinal; // 保存 function save(ctxt: Tcontext): cardinal; function execsql(ctxt: Tcontext): cardinal; end; implementation function Tcds.execsql(ctxt: Tcontext): cardinal; var ser, ser2: TSerialize; pool: TDBPool; db: TDB; begin ser := TSerialize.Create; ser2 := TSerialize.Create; try try ser.unMarshal(ctxt.InContent); pool := GetDBPool(ser.asStr['dbid']); db := pool.Lock; db.execsql(ser.asStr['sql']); ser2.asBool['ok'] := true; ctxt.OutContent := ser2.marshal3; except on E: Exception do begin ser2.asBool['ok'] := false; ser2.asStr['message'] := E.Message; ctxt.OutContent := ser2.marshal3; writelog('api.clientdataset.execsql()' + E.Message); end; end; finally pool.Unlock(db); ser.free; ser2.free; end; end; function Tcds.save(ctxt: Tcontext): cardinal; var ser, ser2: TSerialize; pool: TDBPool; db: TDB; i, err: Integer; needFlds: string; begin ser := TSerialize.Create; ser2 := TSerialize.Create; try try ser.unMarshal(ctxt.InContent); pool := GetDBPool(ser.asStr['dbid']); db := pool.Lock; db.startTrans; for i := 1 to ser.asByte['count'] do begin db.qry.Close; db.qry.SQL.Clear; //有的字段不要保存 needFlds := db.getNeedFields(ser.asStr['tablename' + i.ToString], ser.asStr['nonfields' + i.ToString]); db.qry.SQL.Text := 'select ' + needFlds + ' from ' + ser.asStr['tablename' + i.ToString] + ' where 1=2'; db.dsp.ApplyUpdates(ser.asVariant['delta' + i.ToString], 0, err); if err > 0 then begin db.rollbackTrans; ser2.asBool['ok'] := false; ctxt.OutContent := ser2.marshal3; end; end; db.commitTrans; ctxt.OutContent := ser2.marshal3; Result := 200; except on E: Exception do begin db.rollbackTrans; ser2.asBool['ok'] := false; ser2.asStr['message'] := E.Message; ctxt.OutContent := ser2.marshal3; writelog('api.clientdataset.save()' + E.Message); end; end; finally pool.Unlock(db); ser.free; ser2.free; end; end; function Tcds.select(ctxt: Tcontext): cardinal; var ser, ser2: TSerialize; pool: TDBPool; db: TDB; i: Integer; begin ser := TSerialize.Create; ser2 := TSerialize.Create; try try ser.unMarshal(ctxt.InContent); pool := GetDBPool(ser.asStr['dbid']); db := pool.Lock; for i := 1 to ser.asByte['count'] do ser2.asVariant['ds' + i.ToString] := db.select2(ser.asStr['sql' + i.ToString]); ser2.asBool['ok'] := True; ctxt.OutContent := ser2.marshal3; Result := 200; except on E: Exception do begin ser2.asBool['ok'] := false; ser2.asStr['message'] := E.Message; ctxt.OutContent := ser2.marshal3; writelog('api.clientdataset.select()' + E.Message); end; end; finally pool.Unlock(db); ser.free; ser2.free; end; end; var _: Tcds; initialization _router.Post('/cds/select', _.select); _router.Post('/cds/save', _.save); _router.Post('/cds/execsql', _.execsql); end.
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18591786
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-12-07 mormot事务控制
2017-12-07 非正常情况下的移动加权平均算法
2017-12-07 unigui在阿里云服务器上部署