2

次の構造を持つ単純なデータセットがあります。

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

データセットには 1 つのレコードがあります。次に、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に報告しました。サンプル プロジェクトもそこからダウンロードできます。

これがミダスのデザインなのだろうか?それともバグですか?

4

1 に答える 1

0

ATClientDataSetには、BLOB が変更されたかどうかを確認するための組み込みプロパティがあります。

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

これらの文字列型は (サイズに応じて) blob として分類される可能性があるため、CDS.Fields.FieldByName(field_name).IsBlobTrue を返し、 にない場合CDS.Fields.FieldByName(field_name).DataTypeにのみこれを使用し ます。[ftString, ftWideMemo, ftWideString]OldValueNewValueNULL

于 2016-08-23T06:02:20.700 に答える