代码之家  ›  专栏  ›  技术社区  ›  mjn anonym

如何检测ApplyUpdates是否将插入或更新数据?

  •  5
  • mjn anonym  · 技术社区  · 15 年前

    在客户端数据集的AfterPost事件处理程序中,如果当前记录的ApplyUpdates函数将执行更新或插入,则需要该信息。

    AfterPost事件将针对新的和更新的记录执行,我不想声明一个新的标志变量来指示“更新”或“插入”操作是否正在进行。

    示例代码:

    procedure TdmMain.QryTestAfterPost(DataSet: TDataSet);
    begin
      if IsInserting(QryTest) then
         // ShowMessage('Inserting')...
      else
         // ShowMessage('Updating');
    
      QryTest.ApplyUpdates(-1); 
    end;
    

    应用程序将在ApplyUpdate完成后,在AfterPost方法中写入日志。所以这个方法是最接近操作的地方,我更喜欢一个完全可以插入到这个事件处理程序中的解决方案。

    如何使用clientdataset实例qrytest中的信息实现isinserting函数?

    编辑 :我将尝试clientDataSet.updateStatus,解释如下 here .

    3 回复  |  直到 15 年前
        1
  •  6
  •   Fabricio Araujo    15 年前

    ApplyUpdates不会提供这些信息,因为它可以插入、更新和删除。

    ApplyUpdates应用存储在delta数组上的更改信息。例如,更改信息可以包含任意数量的不同类型的更改(插入、删除和更新),所有这些更改都将应用于同一个调用。

    在TDatasetProvider上,您有beforeupdateRecord事件(或者类似的事件,sleep在内存中做一些有趣的事情:-)。在将delta的每个记录应用到基础数据库/数据集之前调用该事件,因此获取此类信息的位置…但ShowMessage将停止应用过程。

    编辑:现在我记得还有另一个选项:您可以将delta分配给另一个clientdataset数据属性,并读取该记录的数据集更新状态。 当然,你需要这样做 之前 正在执行ApplyUpdates…

    var
      cdsAux: TClientDataset;
    begin
      .
      . 
      <creation of cdsAux>
      cdsAUx.Data := cdsUpdated.Delta;
      cdsAux.First;
      case cdsAux.UpdateStatus of
        usModified:
          ShowMessage('Modified');
        usInserted:
          ShowMessage('Inserted');
        usDeleted:
          ShowMessage('Deleted'); // For this to work you have to modify  
                                  // TClientDataset.StatusFilter  
      end;
      <cleanup code>
    end;
    
        2
  •  4
  •   zendar    15 年前

    TDatasetProvider上的BeforeUpdateRecord事件定义为:

    procedure BeforeUpdateRecord(Sender: TObject;  SourceDS: TDataSet; DeltaDS:
                                 TCustomClientDataSet; UpdateKind: TUpdateKind;
                                 var Applied: Boolean);
    

    参数 UpdateKind 说明将如何处理记录: ukModify, ukInsert or ukDelete . 您可以这样测试它:

    procedure TSomeRDM.SomeProviderBeforeUpdateRecord(Sender: TObject;
          SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
          var Applied: Boolean);
    begin
      case UpdateKind of
        ukInsert :
             // Process Insert;
        ukModify :
             // Process update
        ukDelete :
             // Process Delete
      end;
    end;
    

    注意:此事件签名来自Delphi7。我不知道Delphi的后期版本是否有变化。

        3
  •  3
  •   Cary Jensen    15 年前

    将clientDataSet.statusFilter设置为tupdateStatus值,然后读取clientDataSet.recordCount

    例如,

     ClientDataSet1.StatusFilter := [usDeleted];
     ShowMessage(IntToStr(ClientDataSet1.RecordCount));
    

    将返回将执行的删除查询数。

    不过,请注意两件事。将statusfilter设置为usmodified始终包括已修改和未修改的记录,因此您将获取该值的一半(值为4表示将执行2个更新查询)。另外,将statusfilter设置为[](空集)是如何还原为默认视图(已修改、未修改和已插入)

    在执行此操作之前,请确保已发布任何未发布的更改,否则可能不会考虑未发布的更改。