标签:end string CRUD delphi db REST res qry serial
delphi自动生成资源的REST CRUD工具
该工具同样,还可以将资源生成GOOGLE PROTOBUF CRUD。
运行tableTool.exe工具,设置参数,连接数据库。
以“计量单位”资源为例,选择“tunit”数据表,点击“查询”按钮,点击“生成REST CRUD”按钮,点击“保存成文件”按钮,选择中间件源码所在目录,文件名就用自动生成的。
查看生成的rest.tunit.pas
unit rest.tunit; //代码由代码工厂自动生成 //2022-07-10 {$I def.inc} interface uses {$IFDEF firedac} db.firedac, db.firedacPool, {$ENDIF} {$IFDEF unidac}db.unidac, db.unidacpool, {$ENDIF} classes, db, system.JSON.Serializers, yn.log, system.JSON, SysUtils, json.help; type Ttunit = record [Serialize(1)] unitid: string; [Serialize(2)] unitname: string; end; TtunitArray = record [Serialize(1)] status: integer; [Serialize(2)] exception: string; [Serialize(3)] message: string; [Serialize(4)] tunits: TArray<Ttunit>; end; TRes = record [Serialize(1)] status: integer; [Serialize(2)] exception: string; [Serialize(3)] message: string; end; function select(url: string; body: TBytes): string; function insert(url: string; body: TBytes): string; function update(url: string; body: TBytes): string; function delete(url: string; body: TBytes): string; implementation function select(url: string; body: TBytes): string; var db: tdb; pool: tdbpool; arr: TArray<string>; serial: TJsonSerializer; rows: TtunitArray; i, h: integer; res: TRes; begin serial := 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 * from tunit'; db.qry.Open; SetLength(rows.tunits, db.qry.RecordCount); db.qry.First; i := 0; while not db.qry.Eof do begin rows.tunits[i].unitid := db.qry.fieldbyname('unitid').asstring; rows.tunits[i].unitname := db.qry.fieldbyname('unitname').asstring; rows.status := 1; rows.message := 'success'; inc(i); db.qry.Next; end; result := serial.Serialize<TtunitArray>(rows); except on E: Exception do begin res.status := 0; res.exception := E.message; result := serial.Serialize<TRes>(res); end; end; finally pool.Unlock(db); serial.Free; end; end; function insert(url: string; body: TBytes): string; var db: tdb; pool: tdbpool; arr: tarray<string>; serial: TJsonSerializer; res: TRes; begin serial := TJsonSerializer.Create; try try var rows: TtunitArray; rows := serial.Deserialize<TtunitArray>(TEncoding.UTF8.GetString(body)); arr := url.Split(['/']); pool := GetDBPool(arr[4]); db := pool.Lock; db.startTrans; for var row: Ttunit in rows.tunits do begin db.qry.Close; db.qry.SQL.Clear; db.qry.SQL.Text := 'insert into tunit (unitid,unitname) values (:unitid,:unitname)'; db.qry.ParamByName('unitid').AsString := row.unitid; db.qry.ParamByName('unitname').AsString := row.unitname; db.qry.ExecSQL; end; db.commitTrans; res.status := 1; res.message := 'success'; Result := serial.Serialize<TRes>(res); except on E: Exception do begin db.rollbackTrans; res.status := 0; res.exception := E.Message; Result := serial.Serialize<TRes>(res); end; end; finally pool.Unlock(db); serial.Free; end; end; function update(url: string; body: TBytes): string; var db: tdb; pool: tdbpool; arr: tarray<string>; serial: TJsonSerializer; res: TRes; begin serial := TJsonSerializer.Create; try try var rows: TtunitArray; rows := serial.Deserialize<TtunitArray>(TEncoding.UTF8.GetString(body)); arr := url.Split(['/']); pool := GetDBPool(arr[4]); db := pool.Lock; db.startTrans; for var row: Ttunit in rows.tunits do begin db.qry.Close; db.qry.SQL.Clear; db.qry.SQL.Text := 'update tunit set unitid=:unitid,unitname=:unitname where unitid=:key0'; db.qry.ParamByName('unitid').AsString := row.unitid; db.qry.ParamByName('key0').AsString := row.unitid; db.qry.ParamByName('unitname').AsString := row.unitname; db.qry.ExecSQL; end; db.commitTrans; res.status := 1; res.message := 'success'; Result := serial.Serialize<TRes>(res); except on E: Exception do begin db.rollbackTrans; res.status := 0; res.exception := E.Message; Result := serial.Serialize<TRes>(res); end; end; finally pool.Unlock(db); serial.Free; end; end; function delete(url: string; body: TBytes): string; var db: tdb; pool: tdbpool; arr: tarray<string>; serial: TJsonSerializer; res: TRes; begin serial := 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 := 'delete from tunit where unitid=:key0'; db.qry.ParamByName('key0').AsString := arr[5]; db.qry.ExecSQL; res.status := 1; res.message := 'success'; Result := serial.Serialize<TRes>(res); except on E: Exception do begin res.status := 0; res.exception := E.Message; Result := serial.Serialize<TRes>(res); end; end; finally pool.Unlock(db); serial.Free; end; end; end.
到sock.router.pas增加路由方法。
运行服务端
clientRest客户端uses rest.tunit;
rest.tunit是工具自动生成的。
增加CRUD代码
procedure TForm1.Button1Click(Sender: TObject); //新增json begin var t: rest.tunit.TtunitArray; SetLength(t.tunits, 1); t.tunits[0].Unitid := '10'; t.tunits[0].Unitname := '新增'; var res: string := TRest.inJson<rest.tunit.TtunitArray>('/rest/unit/insert/1', t); var r: TRes := TRest.unmarshal<TRes>(res); if r.Status = 0 then ShowMessage('err: ' + r.Exception) else ShowMessage('ok'); end;
procedure TForm1.Button3Click(Sender: TObject); //修改json begin var t: rest.tunit.TtunitArray; SetLength(t.tunits, 1); t.tunits[0].Unitid := '10'; t.tunits[0].Unitname := '修改'; var res: string := TRest.inJson<rest.tunit.TtunitArray>('/rest/unit/update/1', t); var r: TRes := TRest.unmarshal<TRes>(res); if r.Status = 0 then ShowMessage('err: ' + r.Exception) else ShowMessage('ok'); end;
procedure TForm1.Button5Click(Sender: TObject); //json查询 begin var t: rest.tunit.TtunitArray := TRest.outJson<rest.tunit.TtunitArray>('/rest/unit/select/1'); if t.Status = 0 then begin ShowMessage(t.Exception); Exit; end; FDMemTable1.EmptyDataSet; FDMemTable1.DisableControls; for var dw: rest.tunit.Ttunit in t.tunits do FDMemTable1.AppendRecord([dw.Unitid, dw.Unitname]); FDMemTable1.First; FDMemTable1.EnableControls; end;
procedure TForm1.Button7Click(Sender: TObject); //删除json begin var res: string := TRest.inUrl('/rest/unit/delete/1/10'); var r: TRes := TRest.unmarshal<TRes>(res); if r.Status = 0 then ShowMessage('err: ' + r.Exception) else ShowMessage('ok'); end;
标签:end,string,CRUD,delphi,db,REST,res,qry,serial 来源: https://www.cnblogs.com/hnxxcxg/p/16463072.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。