2

我有一个具有以下结构的简单数据集:

Server.FieldDefs.Add('Code', ftString, 5);
Server.FieldDefs.Add('Memo', ftMemo, 0);
Server.FieldDefs.Add('Blob', ftBlob, 0);

数据集有一条记录。然后我通过 TClientDataSet 实例中的 TDataSetProvider 获取数据集,更改数据并应用更新。它将触发 TDataSetProvider 的 BeforeUpdateRecord 和 AfterUpdateRecord 事件。

但是,ftBlob 字段的 OldValue 始终显示 Null,但 ftMemo 和 ftString 字段不显示 Null:

OnBeforeUpdateRecord
Code.OldValue is not null
Code.NewValue is not null
Memo.OldValue is not null
Memo.NewValue is not null
Blob.OldValue is null
Blob.NewValue is not null

OnAfterUpdateRecord
Code.OldValue is not null
Code.NewValue is not null
Memo.OldValue is not null
Memo.NewValue is not null
Blob.OldValue is null
Blob.NewValue is not null

虽然 ftMemo 字段也没有返回正确的结果。ftMemo 字段的 OldValue 始终为空字符串。

我已将此问题报告给RSP-15519。一个示例项目也可以从那里下载。

只是想知道这是否是迈达斯的设计?或者它是一个错误?

4

1 回答 1

0

ATClientDataSet有一个内置属性来检查 blob 是否已被修改:

function BlobIsModified(CDS: TClientDataSet; BlobFieldName: string): Boolean;
begin
  Exit((CDS.Fields.FieldByName(BlobFieldName) as TBlobField).Modified);
end;

我们只在 CDS.Fields.FieldByName(field_name).IsBlob返回 True 时才使用它,而CDS.Fields.FieldByName(field_name).DataType不是 in [ftString, ftWideMemo, ftWideString],因为这些字符串类型可能被归类为 blob(取决于它们的大小),在这种情况下,您应该使用OldValueNewValue和检查NULL来确定是否发生了变化。

于 2016-08-23T06:02:20.700 回答