FireDAC 数据库开发笔记 (第一章 FireDAC开发数据库应用 , 第二章 处理数据库)

 

  • 连接数据库

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

    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;

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

     
                
        
    
    
    
    
    

    

posted @ 2022-05-23 20:44  麦麦提敏  阅读(966)  评论(0编辑  收藏  举报