我有需要存儲在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字節,一切工作正常。 我只是沒有看到任何可能導致它的東西。
服務器操作系統或數據庫軟件中是否安裝了任何更改/補丁? – 2009-08-24 06:56:44
不,我只需要運行一段時間的可執行文件,然後將其與特定的二進制數據一起提供給它,並且它會從數據庫更改而來。我嘗試了幾個在過去幾年中完成的版本,所有的表現都一樣。 如果它打破了一組數據,它通常是壞的。我相信它不是數據庫本身,它應該是我的代碼中的某些東西,也許是一些轉換。我只是看不到它。 – Holgerwa 2009-08-24 07:33:53
對不起,數據庫服務器也不改變。這是一個嵌入式數據庫引擎,這使得它只是我的可執行文件依賴。 – Holgerwa 2009-08-24 07:35:17