mORMot 增、查、改、删 —— CRUD (二)

mORMot 增、查、改、删 —— CRUD (二)

最近有看了会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;

其实 对于DB这个数据模型,在执行 Add之后,会返回ID号,这个数字是一个大于0 的数字。

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;
posted @ 2022-05-03 00:19  海利鸟  阅读(416)  评论(0编辑  收藏  举报