Delphi XE では、さまざまなフィールドが変更されたかどうかを確認するために、TpFIBDataSet のOldValueとNewValueを使用しています (ただし、TDataSet の子孫に適用できます)。私の質問は、ブロブ フィールドのこれら 2 つの値を TMemoryStreams として取得するにはどうすればよいですか? 私はいくつかの調査を行いましたが、何も見つかりませんでした。
質問する
5709 次
2 に答える
3
フィールドが変更されたかどうかを検出するルーチンを使用して、データベースに送信するフィールドを変更されたフィールドのみに制限できるようにします。今日、BLOB フィールドを処理するためのコードをそのルーチンに追加しまし.AsVariant
た。すべてのユースケースでこれをテストしたわけではありませんが、これまでのところかなり安定しているようです。OldValue
NewValue
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
に簡単に保存できます。TBytesStream
TMemoryStream
TBytesStream.SaveToStream()
于 2013-10-31T17:09:33.110 に答える