在 Delphi XE 上,我使用TpFIBDataSet 中的OldValue和NewValue(但它可以应用于任何 TDataSet 后代),以验证不同字段是否已更改。我的问题是如何将 blob 字段的这 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
它,因为它完成了我通常使用TMemoryStream
for 的相同事情,并且如果您查看它的构造函数,它不会像这样做那样重新分配内存并将二进制数据复制到它TMemoryStream
。
如果你真的需要使用TMemoryStream
,你可以很容易的保存TBytesStream
到TMemoryStream
usingTBytesStream.SaveToStream()
方法中。
于 2013-10-31T17:09:33.110 回答