我有一个简单的数据集,其结构如下:
Server.FieldDefs.Add('Code', ftString, 5);
Server.FieldDefs.Add('Memo', ftMemo, 0);
Server.FieldDefs.Add('Blob', ftBlob, 0);
数据集有一条记录。然后我通过TClientDataSet实例中的TDataSetProvider获取数据集,更改数据和ApplyUpdate。它将触发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。示例项目也可以从那里下载。
只是想知道这是否是迈达斯的设计?或者这是一个错误?
答案 0 :(得分:0)
TClientDataSet
有一个内置属性来检查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
不在[ftString, ftWideMemo, ftWideString]
中,因为这些字符串类型可能被归类为blob(取决于它们的大小),在这种情况下您应该使用OldValue
,NewValue
并检查NULL
以确定是否有更改。