• 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;
  • 相关阅读:
    【Java并发】详解 AbstractQueuedSynchronizer
    【Java 并发】详解 ThreadLocal
    【应用】Markdown 在线阅读器
    【HTML5】Canvas 内部元素添加事件处理
    【HTML5】Canvas 实现放大镜效果
    分享一款Markdown的css样式
    【Pthreads】Pipeline Model(Assembly Line)示例
    简单实现依赖注入(无框架)
    JavaWeb 简单实现客户信息管理系统
    Python中模块的发布与安装
  • 原文地址:https://www.cnblogs.com/hieroly/p/16217453.html
Copyright © 2020-2023  润新知