【问题标题】:TBlobField.OldValue always show null in BeforeUpdateRecord and AfterUpdateRecord eventTBlobField.OldValue 在 BeforeUpdateRecord 和 AfterUpdateRecord 事件中始终显示 null
【发布时间】:2016-07-21 10:09:45
【问题描述】:

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

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。一个示例项目也可以从那里下载。

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

【问题讨论】:

  • 在编辑记录之前,表中“Blob”字段的值是多少?我敢打赌它是空的。此外,您应该向我们展示一些 Delphi 代码,而不是您的伪代码。你让我们猜测。
  • 看看设置 dspropINCLBLOBSINDELTA 是否可以解决问题

标签: delphi datasnap tclientdataset midas-server


【解决方案1】:

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(取决于它们的大小),在这种情况下您应该使用 OldValueNewValue,并检查 NULL 以确定是否有更改。

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2018-04-20
    • 2014-09-01
    • 1970-01-01
    • 2015-07-07
    • 2011-10-15
    相关资源
    最近更新 更多