You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除记录时Nested ClientDataSet抛出异常的解决方案咨询

Delphi Alexandria嵌套ClientDataSet重复删除异常的简便处理方案

针对你升级后遇到的嵌套ClientDataSet删除异常(子数据集B、C指向同一张物理表,B删除后C再删触发“Record not found or changed by another user”错误),以下是几个无需大幅重写数据模块的简便解决方法:

方法一:拦截子数据集C的更新错误

给子数据集C的OnUpdateError事件添加处理逻辑,直接跳过无影响的删除错误:

  • 打开数据模块设计视图,选中ClientDataSetC,在事件面板中找到OnUpdateError并添加代码:
procedure TYourDataModule.ClientDataSetCUpdateError(Sender: TObject;
  E: EDatabaseError; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
  if (UpdateKind = ukDelete) and (Pos('Record not found or changed by another user', E.Message) > 0) then
  begin
    // 跳过这条错误记录,继续执行后续更新
    UpdateAction := uaSkip;
  end;
end;

这个方法最直接,仅需几行代码就能解决问题,不影响其他数据集的正常更新流程。

方法二:手动处理子数据集C的删除操作

通过Provider的OnUpdateRecord事件接管C的删除逻辑,忽略删除行数为0的情况:

  • 选中C对应的Provider组件,添加OnUpdateRecord事件处理:
procedure TYourDataModule.ProviderCUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
var
  IDValue: Variant;
begin
  if UpdateKind = ukDelete then
  begin
    // 获取要删除记录的主键值
    IDValue := DeltaDS.FieldByName('YourPrimaryKey').Value;
    // 手动执行删除语句,不检查返回行数
    SourceDS.Connection.Execute('DELETE FROM YourPhysicalTable WHERE YourPrimaryKey = :ID', [IDValue]);
    // 标记该更新已处理,避免默认Resolver再执行
    Applied := True;
  end;
end;

这个方法绕开了默认TSQLResolver的行数检查,从根源上避免异常触发,适合需要精确控制更新逻辑的场景。

方法三:修改TSQLResolver的行为(进阶)

如果多个数据集都有类似问题,可以子类化TSQLResolver,重写DoExecSQL方法,允许删除操作的RowsAffected=0:

type
  TCustomSQLResolver = class(TSQLResolver)
  protected
    procedure DoExecSQL(ASQL: string; var ARowsAffected: Integer); override;
  end;

procedure TCustomSQLResolver.DoExecSQL(ASQL: string; var ARowsAffected: Integer);
begin
  inherited;
  // 判断是否是删除语句且行数为0,伪造成功标记
  if (Pos('DELETE', UpperCase(ASQL)) > 0) and (ARowsAffected = 0) then
    ARowsAffected := 1;
end;

之后将对应Provider的ResolverClass属性设置为TCustomSQLResolver即可。这个方法适合批量处理同类型问题,但需要对VCL源码有基础了解。

内容的提问来源于stack exchange,提问作者tua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:22:45