2009-08-23 75 views
2

我有需要存儲在SQL數據庫的BLOB字段中的二進制數據。 在UPDATE(存儲到數據庫)的情況下,二進制數據以字符串形式出現(BDS2006,沒有unicode)。 當BLOB字段爲READ時,二進制數據需要作爲字符串返回。 因此,我使用的代碼這兩件(QRY是一個TQuery的):更新blob時出現問題,如果blob包含特定數據

READ:

var s: string; 
begin 
    qry.SQL.Text := 'SELECT BlobField FROM Table WHERE ID=xxx'; 
    qry.Open; 
    if qry.RecordCount > 0 then 
    begin 
     qry.First; 
     s := qry.FieldByName('BlobField').AsString; 
    end; 
end; 

UPDATE:

var s: string; 
begin 
    s := ...binary data... 
    qry.SQL.Text := 'UPDATE Table Set BlobField=:blobparam WHERE ID=xxx'; 
    qry.ParamByName('blobparam').AsBlob = s; 
    qry.ExecSQL; 
end; 

我不知道如果這是正確的/好的/好的方式來做到這一點,但它已經運行好幾年了。

現在有一組特定的二進制數據,它們被更新到數據庫後,然後從數據庫中讀取被更改/損壞。 將ExecSQL之前的參數值與讀取後的s值進行比較時,數據的最後一個字節(總共爲1519字節)從02h更改爲00h。

由於我不確定我的代碼是否正常工作,我試圖使用TBlobStream來檢查結果是否更改。

READ:

var s: string; 
    bs: TStream; 
    st: TStringStream; 
begin 
    qry.SQL.Text := 'SELECT BlobField FROM Table WHERE ID=xxx'; 
    qry.Open; 
    if qry.RecordCount > 0 then 
    begin 
     qry.First; 
     st := TStringStream.Create(''); 
     bs := qry.CreateBlobStream(qry.FieldByName('BlobField'), bmRead); 
     bs.Position := 0; 
     st.CopyFrom(bs, bs.Size); 
     st.Position := 0; 
     s := st.ReadString(st.Size); 
    end; 
end; 

UPDATE:

的結果是一樣的,讀取數據的最後一個字節被破壞。

可能是我的問題?


編輯:

只使用流產生同樣的問題。

我發現這隻發生在數據正好是1519字節的情況下。然後,只有這樣,無論以前是什麼,最後一個字節都設置爲0。當然,這個問題可能還有其他的情況,但這是我每次都能重現的情況。

如果我添加一個字節到最後,使它1520字節,一切工作正常。 我只是沒有看到任何可能導致它的東西。

+0

服務器操作系統或數據庫軟件中是否安裝了任何更改/補丁? – 2009-08-24 06:56:44

+0

不,我只需要運行一段時間的可執行文件,然後將其與特定的二進制數據一起提供給它,並且它會從數據庫更改而來。我嘗試了幾個在過去幾年中完成的版本,所有的表現都一樣。 如果它打破了一組數據,它通常是壞的。我相信它不是數據庫本身,它應該是我的代碼中的某些東西,也許是一些轉換。我只是看不到它。 – Holgerwa 2009-08-24 07:33:53

+0

對不起,數據庫服務器也不改變。這是一個嵌入式數據庫引擎,這使得它只是我的可執行文件依賴。 – Holgerwa 2009-08-24 07:35:17

回答

1

我同意格里尾部NULL看起來像一個字符串問題。

您修改的代碼仍然使用TStringStream寫入數據。您是否嘗試過使用TBlobStream編寫數據,並查看它是否有所作爲?

或者,在問題數據的末尾添加一些打包字節,以檢查它是否與特定大小/邊界問題相關。或者嘗試用固定的測試模式替換問題數據,以縮小問題範圍。

FWIW我已經很長時間沒有問題地使用blob,但從未將它們視爲字符串。

祝你好運縮小問題。

更新:在我看來,你的代碼是好的,但你在數據庫/數據訪問軟件的某個地方碰到別人的bug。你使用什麼數據庫/驅動程序/訪問代碼?

+0

請參閱修改問題。 – Holgerwa 2009-08-25 14:43:47

+0

問題是數據庫相關,感謝所有幫助我們找到原因的建議。 – Holgerwa 2009-08-29 08:25:45