代码之家  ›  专栏  ›  技术社区  ›  RBA

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

  •  4
  • RBA  · 技术社区  · 12 年前

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

    2 回复  |  直到 12 年前
        1
  •  3
  •   James L.    12 年前

    我使用一个例程来检测字段是否发生了更改,这样我就可以将发送到数据库的字段限制为仅更改的字段。我今天向该例程添加了处理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;
    
        2
  •  0
  •   James L.    12 年前

    我是这样做的:

    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 对于,如果你看看它的构造函数,它不会像这样重新分配内存并将二进制数据复制到它 T内存流

    如果你真的需要使用 T内存流 ,您可以轻松保存 T字节流 T内存流 使用 TBytesStream.SaveToStream() 方法