最近有看了会mORMot ,总感觉这是个好框架,其实好多Delphi开源框架也是建立在他上面,QuickORM、DelphiWebMVC。
这次想对mORMot 数据库相关使用再次做个笔记。
记得以前有个ECO我当时也花了好久学习,希望能够能简化开发周期,降低业务模型建立,但后开发团队转到c#下了。
言归正传mORMot 和ECO在对库ORM时都会自动建立一个字段 ID 用以构建,表的关系和引导对应记录。
按这个思路,我们可以继续……
在mORMot 中如果要让一个对象服务于一个数据模型,那么就必须让这个模型增加对象。
比如:前文提到的
Account := TAccount.Create; Account.Name := TGuidxxxxx; Account.Account := 123; Account.Sno := 'abcd'; if db.Add(Account, True) = 0 then begin ShowMessage('失败'); end;
acc := TAccount.Create(db, 'Name=?', [edt1.Text]); //下面这句是错误的,一定会有实例,只是这个实例是否有效 if acc<>nil then begin //Do Samething end; //在一个数据模型中找并创建,一定会有实例,只是这个实例是否有效,通过ID来判断。 if acc.ID>0 then begin //Do Samething edt3.Text := acc.Name; end;
同理,Update和Delete也是这么回事。
但作为体系型框架mORMot 对于数据库的操作要复杂得多,这句话可以这么来讲,站在构建的角度他是ORM,在客户端实现跨平台、跨应用、跨系统访问同一数据库。
从实现的方式可以从服务器端直接操作、从客户端操作。从语言角度内置VCL数据展示和JSON自定义。
为了能实现快平台,快语言,它以RESTFUL作为基础通讯,当然也支持其它方式。
VCL Grid显示数据,mORMot 已经实现主要的功能,可以通过
function TRestClient_YJ.GetCMDHis(const StartDT, EndDT: Tdatetime): TSQLTableJSON; var vStartDT, vEndDT: TTimeLog; begin // 使用完毕需要释放,要在调用函数中释放 『但其实不可以释放』 vStartDT := TimeLogFromDateTime(StartDT); vEndDT := TimeLogFromDateTime(EndDT); Result := _RestClient.ORM.MultiFieldValues(TCMDHis, 'ID,CreationDate,CommandID, EmployeeNo, EquipmentCode, CMDSerial', 'CreationDate >= ? AND CreationDate <= ?', [vStartDT, vEndDT]); //建立指定字段的数据表 (TSQLTableJSON) end; …… var fGrid : TSQLTableToGrid; fTable: TSQLTableJSON; DGrid:TDrawGrid ; // 继承自TDrawGrid 下的都可以 …… try fTable := _Client.GetCMDHis(dtpStart.DateTime, dtpEnd.DateTime); fGrid := TSQLTableToGrid.Create(DGrid, fTable, nil); //关键语句 fGrid.SetAlignedByType(sftCurrency, alRight); fGrid.OnValueText := OnText; // fGrid.SetFieldFixedWidth(100); fGrid.FieldTitleTruncatedNotShownAsHint := true; DGrid.Options := DGrid.Options + [goRowSelect]; RowsCount := fTable.RowCount; Timer.Stop; finally Screen.Cursor := crDefault; end;
获取指定行的数据
procedure TOfflineDataFrame.N1Click(Sender: TObject); var R, C : Integer; sData: RawByteString; begin inherited; //这里示例表格内查找 R := DGrid.Row; C := DGrid.Col; if (R <= 0) or (fGrid.Table = nil) then exit; //这里需要注意U2S函数,mORMot内部所有字符串数据均已转为为UTF8 所以要恢复到 UTF16,要还原。 sData := U2S(fGrid.Table.FieldValue('CMDSerial', R)); if MesCommunication.TCP_SendYJ2(sData) then begin LogDebug('离线发送:' + sData) end; end;
删除指定行数据
procedure TOfflineDataFrame.N2Click(Sender: TObject); var R, C : Integer; sData: RawByteString; sID : string; ID : Integer; begin inherited; R := DGrid.Row; C := DGrid.Col; if (R <= 0) or (fGrid.Table = nil) then exit; //同前一段,查找,另外对于删除也做了一下调整, //-----这里改为调用服务器函数的方式,而没有用客户端链接数据模型, /。/另外已经方位到了ID所以直接用 sID := U2S(fGrid.Table.FieldValue('ID', R)); //服务器端删除成功然后调用一次显示。 if _Client.DelCMDHis(StrToInt(sID)) then btnQueryClick(nil); end;
服务器端的删除代码
//通过关键信息查找ID function TServiceMethods.DelCMDHis(const aCMD_ID: string): boolean; var vCMDHis: TCMDHis; begin Result := false; vCMDHis := TCMDHis.Create(RestServer.ORM, 'GUID=?', [aCMD_ID]); if vCMDHis.ID > 0 then Result := RestServer.ORM.Delete(TCMDHis, vCMDHis.ID); end; //直接使用ID function TServiceMethods.DelCMDHisID(const aID: integer): boolean; var vCMDHis: TCMDHis; begin Result := false; if aID > 0 then Result := RestServer.ORM.Delete(TCMDHis, aID); end;