在阅读了关于 TDataSetProvider.OnUpdateData 事件解释的 Delphi 帮助文件后:
- 检查数据(例如,对于不应允许的值或数据更改),并引发异常以在更新发生之前取消应用更新。
- 在将数据发送到源数据集或数据库服务器之前更改数据(例如加密或解密值)。
我正在寻找如何更改OnUpdateData 数据的示例代码。我已尽力寻找解决方案。这是我可以实现的:
示例 1:
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.EOF do begin
if DataSet.UpdateStatus = usUnmodified then begin
TPacketDataSet(Dataset).InitAltRecBuffers(True);
if DataSet.UpdateStatus in [usInserted, usModified] then begin
Dataset.Edit;
DataSet.FindField('MyField').AsString := 'zzz';
Dataset.Post;
end;
end;
end;
DataSet.Next;
end;
示例 1 的问题:不幸的是,我一直收到一些字段值丢失的错误。执行一些调试后,我发现有一些必填字段具有空值。
示例 2:
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.EOF do begin
if DataSet.UpdateStatus = usUnmodified then begin
TPacketDataSet(Dataset).InitAltRecBuffers(True);
if DataSet.UpdateStatus in [usInserted, usModified] then
DataSet.FindField('MyField').NewValue:= 'zzz';
end;
DataSet.Next;
end;
end;
示例 2 的问题:通过这种方式编写,我们无需调用 DataSet.Edit 和 DataSet.Post。但是设置为 TField.NewValue 的值“zzz”没有保存到数据库中。
我有一些特殊的原因,这个更新必须在 OnUpdateData 中执行,而不是在更新前/更新后记录中。
请指教。非常感谢。