• FireDAC 数据库开发笔记(1. 处理数据)


    • 连接数据库

      数据库连接组件,支持三种连接方式

      1. 持久定义  (ini文件)(有一个唯一名称和一个配置文件 ini ,可以由FDManager管理  )
      2. 私有定义   (有一个唯一名称可以由FDManager管理,无 ini 配置文件 )
      3. 临时定义(没有名称和配置文件,不能由FDManager管理,运行时将参数写入params属性)

    系统默认文件是
    C:\Users\Public\Documents\Embarcadero\Studio\14.0\FireDAC\FDConnectionDefs.ini

    • 主从关联

    ✅  增加,修改:当 fdqADetail 数据表 AddNew 数据时 fdqADetail 的 mnID 自动新增为  fdqAMain.ID

    1. 客户端范围机制

    fdqAMain   -- SELECT * FROM Amain
    fdqADetail -- SELECT * FROM Adet

    ⛔ 缺点:从数据表的数据量大的话导致客户端从数据库获取大量的数据,消耗大量的网络与客户端内存资源

    2. 伺服端动态查询机制

    使用动态参数
    fdqAMain   -- SELECT * FROM Amain
    fdqADetail -- SELECT * FROM Adet WHERE mnID = :ID

    ⛔  缺点:每次主数据表移动时 就要执行一次SQL命令、如果怕客户端的数量太多会造成数据库龙大的执行负荷。不适合有大量客户端的应用

    3. 所以要结合以上2中方法使用快储机制(Cache)

    方法:
        1. 使用动态参数的SQL命令
        2. 设定从数据 fdqDetail 的 MasterDataSource , MasterFields  和 IndexFieldNames 
        3. 设定从数据表 FetchOptions.Cache 特性值 包含 fiDetails 
    原理:
       【主数据表】的位置改变时、先前【从数据表】中的数据不会被放弃而会快储起来,如果【主数据表】的位置稍后又回到这个位置那么,快储起来的【从数据表】的资料就可以再被使用而在无需在执行一次SQL命令

    • Array DML 处理数据   

    ArrayDML  是批处理数据的概念。 如:客户端需要【新增/修改】大量的数据,ArrayDML 数据库一次执行完毕。 

    -- iRecord 是一次执行数量
    
    fdqData.params.ArraySize := iRecord  // 数量
    for iCur = 0 to iRecord -1 do 
    begin
        fdqData.Params.ParamByName('xxx').asString [iCur] := xxxx
        ..
    end;
    fdqData.Execute(fdqData.params.ArraySize);

      

    • 搜寻数据

    FDQuary 组件执行SQL命令 从后端数据库取得数据之后这些数据暂时储存在FDQuary 组件中。

    1. Locate 方法
      Locate 方法搜寻时,使用任何的字段条件来搜寻,而不用管这个字段是不是索引字段。当然开发者使用【索引字段】来搜寻数据当然速度非常快。
            有3个参数:
                Locate KeyFields, KeyValues, Options 
                Options: lo 开头 、 loCaseInsensitive 、 loPartialKey ... 
             返回: Bool 值
               单字段 
                        FDQuary.Locate('Name', '李', []);
                        FDQuary.Locate('Name', '李', [loPartialKey]);    Name字段以'李'开头的数据
              多字段
                        FDQuary.Locate('City; Rayun', VarArrayOf(['乌鲁木齐,天山区']) , []);

     2. LocateEx 方法

    FireDAC 提供了2个版本的LocateEx 方法: 

    第一个、第二个参数与Locate方法一样,  第三参数扩展了Locate方法

    ✅  LocateEx 和 Locate 不同的地方

    1.  Locate 只能数据集开始的地方往后搜寻,LocateEx 则可以从开始处,目前位置往前/往后搜寻

    2.  Locate 在开始搜寻时 先把后端所有的数据取到数据集中在开始搜寻, LocateEx 不但可以Locate 一样, 也可以目前数据集中搜寻而不要把所有的数据从后端数据中取出来,这样可以减少数据的流量。

    var
        sExpr: String;
    begin
        // 1500 到 2500 之间
        sExpr := 'Memo_Cost >= ' + '''' + '1500' +  '''' + ' and ' + 'Memo_Cost <= ' + '''' + '2500' +  '''' 
        if (adqData.LocateEx(sExpr, [lxoPartialKey, lxoFormCurrent])) then 
        begin
            ..... 显示数据
        end
    
    end

    3. Lookup / LookupEx   (56页)

    Lookup 与 Locate 差别: Locate 找到搜寻资料后,记录位置移动到这个Rec

                                                        Lookup 找到搜寻数据后,不会哟东目前记录的位置, 只有回传第三个字段制定的字段数值

        

    Lookup 的第一个、第二个参数与 Locate 方法一样,

    Lookup 的第三个参数, 当Lookup 找到数据之后,要回传那些字段值

    var
      sFields : String;
      sValues : Variant;
      sResultFields: String;
      sResult : Variant;
    begin
      sFields := edtFindFieldName.Text;
      sValues := VarArrayOf([edtFindValue.Text]);
      sResultFields := 'det_somma; cust_name';
      sResult := FDQuery1.Lookup(sFields,sValues, sResultFields);
    
      if (not VarIsNull(sResult)) then
      begin
        ShowMessage('Found it');
        mmRetMsg.Lines.Add('金额:' + vartostr(sResult[0]) + #13 + #10 + '供货商:' + vartostr(sResult[1]));
      end;
    
    end;

    LookupEx

     LookupEx 方法有2个版本,

      第一个LookupEx 和 Lookup 很像,只是它接受 5个参数,第4 和 第5 参数 LocateEx 方法的最后2个参数一样

      第二个LookupEx :第一个参数 试用一个表达式来搜寻 

    var
        sExpr: String;
        sResultFiles : String;
        vResult : Variant;
    begin
        // 1500 到 2500 之间
        sExpr := 'Memo_Cost >= ' + '''' + '1500' +  '''' + ' and ' + 'Memo_Cost <= ' + '''' + '2500' +  '''' 
        sResultFiles := 'fldName_1;fldName_2';
        
        vResult := fdqData.lookupEx(sExpr,sResultFiles, [lxoPartialKey, lxoFromCurrent]);
        if (not VarIsNull(vResult)) then 
        begin
            xxx := vResult[0];
            yyy := vResult[1];
        end
    end;
    • 排序

    1. 客户端动态排序 (62页)

    FireDAC 提供2中方式可以建立暂时的索引, 1. Indexes 特性  2. indexFieldNames 特性

    button_Click
         fdqData.IndexFieldNames := '字段名';
         
    -- 第二种方式
    button_Click
    var
      anIndex:TFDIndex;
    begin
      anIndex := FDQuery1.Indexes.Add;
      anIndex.Name := 'idx_' + edtFindFieldName.Text;
      anIndex.Fields := edtFindFieldName.Text;
      anIndex.Active := true;
      anIndex.Selected := true

      

    • 过滤

    FireDAC 提供2中方法来使用过滤器,

    第一个: 使用 FDQuery 组件的 Filter 方法

    第二个: 使用FDQuery 组件的 OnFilterRecord 事件处理函数。

    FilterOptions 的参数 类似 Locate 的第三个参数, 用来过滤条件需要分别大小写,是否需要完整的字符串过滤值 ... 

    Button_Click
    -------
    begin
    
      if edtFindValue.Text = '' then
        FDQuery1.Filter := ''
      else
      begin
        FDQuery1.Filter := edtFindFieldName.Text + ' = ' + '''' + edtFindValue.Text + '''';
      end;
    
      FDQuery1.Filtered := true;
    
    end;

    过滤器执行效率, 数据集中数据不多时不错的。

         
                    
            
        
        
        
        
        

        

  • 相关阅读:
    网站安全配置Nginx防止网站被攻击
    JAVA程序打包方法-挺好
    Kettle6.1连接MongoDB报错
    基于Rancher搭建Kubernetes
    Tomcat性能调优实战
    const int * 和 int * const 傻傻分不清楚
    洛谷P1028数的计算
    【转】sizeof()用法总结
    百练4103:踩方格(DFS)
    百练2815:城堡问题(DFS)
  • 原文地址:https://www.cnblogs.com/karkash/p/16302754.html
Copyright © 2020-2023  润新知