gpt4 book ai didi

delphi - 检测空/已填充的 TBlobField 失败

转载 作者:行者123 更新时间:2023-12-03 15:57:45 26 4
gpt4 key购买 nike

我有一个 ftBlob 类型的 fkInternal 计算字段(在 TClientDataSet 中),其中包含 DataSnap 客户端应用程序中的 Blob。

该字段最初是空的,我们仅在实际需要 blob 数据时才填充它*

这是从服务器应用程序提取数据的代码:

var
lBlobStream: TStream;
lBlobField : TBlobField;

with DataSet do
begin
lBlobField := TBlobField(FieldByName(sExpItmFileFile)); // The fkInternalCalc blob
try
// Retrieve the blob stream (calculated field) separately when we don't yet have data:
if lBlobField.isNull then
begin
Edit;
lBlobStream := CreateBlobStream(lBlobField, bmWrite);
DownLoadAttachmentBlob(FieldByName(sExpItmFileID).Asinteger,lBlobStream);
Post;
...
end;

blob 数据检索正常。
我的问题是 if lBlobField.isNull 测试:下次我们输入此代码时(数据集保留在同一条记录上,同时不会调用 ApplyUpdates) 这个值仍然是正确的
我还尝试检查属性 SizeDataSizeBlobSize,它们都是 0。

如何检查我的 TBlobField 是否包含数据?
(或者我在这段代码中做错了什么?)

* 原因:我们不想提取所有这些数据;实际上加载带有许多 blob 的 TClientDataSet 会在我们使用的 RemObjects 组件中出现“包太大”错误

编辑 1:这可能与字段内容不“粘连”有关 - 在紧跟在 Post lBlobField.Value 后面的代码的另一部分为空。

编辑 2:这是一个跨 3 个嵌套表进行查询的数据集。 DataSet 是第三级 TClientDataSet,这里需要将数据 blob写入 fkInternalCalc 字段(因此 bmWrite >、编辑和发布),仅在实际需要时才使用。它们由 DownLoadAttachmentBlob 通过单独的客户端-服务器 channel 进行检索。这会获取记录 ID 作为输入,并将 Blob 数据放入第二个参数 (lBlobStream)。 (嵌套)数据集包含第三级表的所有其他字段(例如 ID sExpItmFileID),但不包含其 blob 数据。 DownLoadAttachmentBlob 工作正常。
一旦 blob 被读入计算字段,我们希望保留它(而不是检索它两次)。

最佳答案

我自己找到了解决方案,这让我完全困惑:

在调用 Dataset Post 方法之前,必须释放 TStream (var lBlobStream)。

所以相关的代码部分应该是:

Edit;
lBlobStream := CreateBlobStream(lBlobField, bmWrite);
DownLoadAttachmentBlob(FieldByName(sExpItmFileID).Asinteger,lBlobStream);
lBlobStream.Free;
Post;

关于delphi - 检测空/已填充的 TBlobField 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com