我有一个fkInternal
计算字段ftBlob
(在TClientDataSet
)包含在DataSnap客户端应用程序中的斑点。检测空/填充TBlobField失败
该字段最初为空,我们只在实际需要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
被称为这个值仍然是真的。
我也曾尝试检查属性Size
,DataSize
,BlobSize
,他们都为0。
我如何检查我的TBlobField包含数据?
(还是我做错了什么在此代码?)
*原因:我们不想把所有这些数据中;实际上加载TClientDataSet
与许多斑点给我们使用的RemObjects组件的'包太大'错误
编辑1:它可能与该字段的内容不“粘” - 在另一部分直接在Post lBlobField.Value
后面的代码是空的。
编辑2:这是一个包含3个嵌套表的查询的数据集。 DataSet
是第三级TClientDataSet
并且这里的数据blobs需要被写到的fkInternalCalc字段(因此bmWrite
,Edit和Post),只有当它们实际需要时。它们通过DownLoadAttachmentBlob
通过单独的客户端 - 服务器通道检索。这将获取记录ID作为输入并将blob数据放入第二个参数(lBlobStream
)。 (嵌套)数据集包含第三级表的所有其他字段(如ID sExpItmFileID
),但不包含其blob数据。 DownLoadAttachmentBlob
工作正常。
一旦blob被读入calc字段,我们希望保留它(不会检索两次)。
很抱歉,如果只是噪音,但你尽管你似乎从中读取创建模式'bmWrite'团块流?此外,不知道'DownLoadAttachmentBlob()'究竟做了什么,blobfield似乎是'ExpItmFileFile',但你将'ExpPItmFileID'传递给函数? –
@TomBrunberg对不起,混淆;-)请参阅编辑2. –
请勿使用*编辑1 *和*编辑2 *乱抛垃圾。通过查看[修订历史记录](http://stackoverflow.com/posts/38588645/revisions),我们可以看到哪个编辑改变了什么。只需编辑帖子并添加详细信息,就好像您将它们写在首位一样。 –