4

Delphi XE では、さまざまなフィールドが変更されたかどうかを確認するために、TpFIBDataSet のOldValueNewValueを使用しています (ただし、TDataSet の子孫に適用できます)。私の質問は、ブロブ フィールドのこれら 2 つの値を TMemoryStreams として取得するにはどうすればよいですか? 私はいくつかの調査を行いましたが、何も見つかりませんでした。

4

2 に答える 2

3

フィールドが変更されたかどうかを検出するルーチンを使用して、データベースに送信するフィールドを変更されたフィールドのみに制限できるようにします。今日、BLOB フィールドを処理するためのコードをそのルーチンに追加しまし.AsVariantた。すべてのユースケースでこれをテストしたわけではありませんが、これまでのところかなり安定しているようです。OldValueNewValue

function FieldChanged(DataSet: TDataSet; FieldName: string): Boolean;
var
  fld: TField;
begin
  fld := DataSet.FieldByName(FieldName);

  if fld.IsBlob then
    Exit((fld as TBlobField).Modified);

  if (fld.OldValue = Null) and (fld.NewValue = Unassigned) then // This happens when a NULL field does not change
    Exit(False)
  else
    Exit(fld.OldValue <> fld.NewValue);
end;
于 2013-11-01T17:07:38.620 に答える
0

私はこのようにします:

var
  stream: TBytesStream;
begin
  if not DataSet.FieldByName('blobfield').IsNull then
  begin
    stream := TBytesStream.Create(DataSet.FieldByName('blobfield').AsBytes);
    // do something with the stream
    FreeAndNil(stream);
  end;
end;

TBytesStream通常 for を使用するのと同じことを達成し、TMemoryStreamそのコンストラクターを見ると、メモリを再割り当てせず、バイナリ データをそれにコピーしないので、使用することを好みますTMemoryStream

本当に を使用する必要がある場合は、 メソッドを使用してをTMemoryStreamに簡単に保存できます。TBytesStreamTMemoryStreamTBytesStream.SaveToStream()

于 2013-10-31T17:09:33.110 に答える