我在一个DataSnap客户端应用程序中有一个TClientDataSet
,其中包含类型为ftBlob
的fkInternal
计算字段,其包含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
),这个值仍然为true。我还尝试过检查
Size
、DataSize
、BlobSize
等属性,它们都为0。
如何检查我的TBlobField是否包含数据?
(或者是我在这段代码中做了什么不对的事情?)
*原因:我们不想把所有这些数据都拉进来;实际上,用许多blob加载TClientDataSet
会在我们使用RemObjects组件时产生“包太大”的错误
编辑1:它可能与字段内容没有“粘合”有关——在代码的另一个部分直接跟随Post的lBlobField.Value
为空。
编辑2:这是一个跨越3个嵌套表的查询数据集。DataSet
是第三级TClientDataSet
,这里的数据blob需要在被实际需要时才进行写入fkInternalCalc字段(因此有bmWrite
、编辑和发布),通过一个单独的客户端服务器通道通过DownLoadAttachmentBlob
检索。它把记录ID作为输入,并将blob数据放在第二个参数(lBlobStream
)中。嵌套数据集包含第3级表的所有其他字段(如ID sExpItmFileID
),但不包含其blob数据。DownLoadAttachmentBlob
运行正常。
一旦一个blob被读入计算字段,我们想让它保持不变(不要两次检索它)。
bmWrite
模式创建了Blob流,然而你似乎需要从中读取?另外,由于不确定DownLoadAttachmentBlob()
函数的具体作用,blob字段是否正确为sExpItmFileFile
但是你却将sExpItmFileID
传递到该函数中? - Tom Brunberg