• FireDAC 数据库开发笔记(2. 快储机制)


    FireDAC 快储机制

    FireDAC 快储功能(Cached Update) 是 新增或修改的数据暂时存储到客户端,等到适当的状态时在更新回后端数据库中。如: 新增或更新的数据量多的时使用此方法。

      1.  FDQuery 的 CachedUpdates = True  --- 开去 快储功能
      2. 使用 Insert , Edit , Delete 和 Post 方法异动数据
      3. 呼叫 ApplyUpdates 方法吧客户端的异动一次写回 后端数据库中
      4. 如果成功 -- 呼叫 FDQuery 的 CommitUpdates 方法清除客户端的异动记录、如果发生错误 -- 呼叫 FDConnection 的 Rollback 方法取消数据写回

    Update Status 时每一个记录的变异情况记录

    • FDQuery 的 Data , Delta 特性

    计算字段  (Calculated Fields): 是指  这个字段并不真正储存在数据表中,而是在程序执行时动态建立的 暂时字段

     fdqData --- AfterPost

    FDMemTable2.Active := False;
    FDMemTable2.Data := fdqData.Delta;
    FDMemTable2.Active := True;

     

    ApplyUpdates  参考代码

    var
        Errors: Integer;
    begin
        dmConn.fdConnection.StartTransaction;
        Errors := dmConn.fdqData.ApplyUpdates(-1);
        if Errors > 0 then 
            dmConn.fdConnection.Rollback
        else
        begin
          dmConn.fdConnection.Commit;
          dmConn.fdqData.CommitUpdates;  -- 清除客户端的异动记录
          dmConn.fdqData.Refresh;
        end;
        
    end
    • SavePoint  (P 84)

    开始异动数据之前建立一个SavePoint , 如果因为特定原因应用程序需要放弃上次SavePoint到现在之间异动的资料,那么程序员可以回到上一次建立的SavePoint

    所有的异动都自动恢复。

    •  RevertRecord方法  恢复到原始的状态
    //  它先判断目前快储的资料,  如果不是未异动过的数
    if dmConn.fdqData.UpdateStatus <> usUnmodified then
       dmConn.fdqData.RevertRecord;
    • FDQuery 的 Commit Updates 方法 

    可以清除所有的快储异动, 快储异动 (Delta) 已经被清除

    • UndoLastChange方法

    TFDQuery 的 UndoLastChange 方法可以以反相的方向逐一的恢复前一次对于数据的异动,一直到最开始的状态。

    • 处理FireDAC快储更新错误

           在使用FireDAC快储功能时,由于在客户端异动的数据是一次更新回后端,因此在更新数据时可能会发生问题

      例如主键值冲突,数据字段数据值己经被其他人/其他客户端异动了或是数据已被其他人/其他客户端删除了等状况。这些状况都会造成ApplyUpdates方法产生错误,对于无法成功更新回后端的数据,

      FireDAC会为每一笔无法更新的数据触发一次 OnReconcileError 事件处理函式,程序员需要在OnReconcileError事件处理函式处理这些产生错误的数据。

       程序员在OnReconcileError事件处理函式中处理错误时,可使用TFDQuery的下面2个特性来取得每一个字段的原始值以及异动过的数值:

  • 相关阅读:
    Unity3d通用工具类之生成文件的MD5
    Unity3d-Socket之龙一编年史network.dll分析(2)-> CNetLogger
    Unity3d-Socket之龙一编年史network.dll分析(1)
    Unity3d设计模式之单例模式
    c#中的??运算符
    java 字节流
    java File文件操作
    java 线程池和lamda表达式
    java 线程状态(通信/等待/唤醒)
    java 线程安全
  • 原文地址:https://www.cnblogs.com/karkash/p/16309243.html
Copyright © 2020-2023  润新知