Delphi - 如何将blob字段的数据集的OldValue和NewValue作为流

时间:2013-10-31 15:23:15

标签: delphi blob firebird delphi-xe

在Delphi XE上我使用来自TpFIBDataSet的OldValueNewValue(但它可以应用于任何TDataSet后代)以验证不同的字段是否已更改。我的问题是如何将这两个blob字段的值检索为TMemoryStreams?我做了一些研究,但我一无所获。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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,因为它完成了我通常使用TMemoryStream的相同内容,如果你看一下它的构造函数,它就不会重新分配内存并将二进制数据复制到它TMemoryStream确实如此。

如果您确实需要使用TMemoryStream,则可以使用TBytesStream方法轻松将TMemoryStream保存到TBytesStream.SaveToStream()