2016-07-26 47 views
2

我有一個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被稱爲這個值仍然是真的
我也曾嘗試檢查屬性SizeDataSizeBlobSize,他們都爲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字段,我們希望保留它(不會檢索兩次)。

+1

很抱歉,如果只是噪音,但你儘管你似乎從中讀取創建模式'bmWrite'團塊流?此外,不知道'DownLoadAttachmentBlob()'究竟做了什麼,blobfield似乎是'ExpItmFileFile',但你將'ExpPItmFileID'傳遞給函數? –

+0

@TomBrunberg對不起,混淆;-)請參閱編輯2. –

+0

請勿使用*編輯1 *和*編輯2 *亂拋垃圾。通過查看[修訂歷史記錄](http://stackoverflow.com/posts/38588645/revisions),我們可以看到哪個編輯改變了什麼。只需編輯帖子並添加詳細信息,就好像您將它們寫在首位一樣。 –

回答

1

找到了解決辦法我自己,這完全令我感到困惑:

TStream(VAR lBlobStream)的調用數據集Post方法之前被釋放。

所以相關的代碼部分應該是:

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

這對我來說並不困難。 TFileStream實際上在寫入文件時也會被釋放。 –

0

我會解決SQL中的這個問題。

在select語句中添加一個額外的字段,詳細說明blob字段是否爲空。

select *, ifnull(BlobField, 1, 0) as BlobNull from mytable 

現在您只需查詢BlobNull字段。顯然你必須調整IfNull函數來匹配數據庫中可用的語法。 另一種可能是僅將測試用作布爾型字段。

select *, (Blobfield is null) as BlobNull from mytable 

更妙的是不要選擇所有字段,而只是拉所需要的領域和使用where條款排除充滿blobfields,但我不知道你的使用情況允許這一點。

+0

在SQL中解決這個問題的好處是,如果你不打算使用它們,那麼你就不需要通過網絡來拖動blob,這會加速很多事情。 – Johan