方法中用到的DbiOpenBlob函數是BDE的API函數
最後如果方法傳入的Mode參數值為bmWrite
數據刪除
分析這段源程序不難知道
● 讀寫BLOB字段
● 要讀寫BLOB字段
● 如果BLOB字段中的數據作了修改
Destroy方法釋放BLOB字段和為FBuffer分配的緩沖區
destructor TBlobStream
begin
if FOpened then
begin
if FModified then FField
if not FField
DbiFreeBlob(FDataSet
end;
if FBuffer <> nil then FreeMem(FBuffer
if FModified then
try
FField
except
Application
end;
end;
如果BLOB流中的數據作了修改
不難看出
Read和Write方法都調用BDE API函數完成數據庫BLOB字段的讀寫
function TBlobStream
var
Status: DBIResult;
begin
Result :=
if FOpened then
begin
Status := DbiGetBlob(FDataSet
Count
case Status of
DBIERR_NONE
begin
if FField
NativeToAnsiBuf(FDataSet
Inc(FPosition
end;
DBIERR_INVALIDBLOBOFFSET:
{Nothing};
else
DbiError(Status)
end;
end;
end;
Read方法使用了BDE API的DbiGetBlob函數從FDataSet中讀取數據
Read方法還調用了NativeToAnsiBuf進行字符集的轉換
function TBlobStream
var
Temp: Pointer;
begin
Result :=
if FOpened then
begin
if FField
begin
GetMem(Temp
try
AnsiToNativeBuf(FDataSet
Check(DbiPutBlob(FDataSet
Count
finally
FreeMem(Temp
end;
end else
Check(DbiPutBlob(FDataSet
Count
Inc(FPosition
Result := Count;
FModified := True;
end;
end;
Write方法調用了BDE API的DbiPutBlob函數實現往數據庫BLOB字段存儲數據
該函數的各參數含義如下
表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
參數名 含義
──────────────────────────────
FDataSetHandle 寫入的數據庫的BDE句柄
FRecord 寫入數據的BLOB字段所在的記錄
FFieldNo BLOB字段號
FPosition 寫入的起始位置
Count 寫入的數據的字節數
Buffer 所寫入的數據占有的內存地址
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
方法中還根據FField和FTransliterate的值判斷是否進行相應的字符集轉換
Seek方法的功能主要是移動BLOB流的位置指針
function TBlobStream
begin
Result :=
if FOpened then
Check(DbiGetBlobSize(FDataSet
end;
function TBlobStream
begin
case Origin of
end;
Result := FPosition;
end;
GetBlobSize調用了BDE API的DbiGetBlobSize函數
[
From:http://tw.wingwit.com/Article/program/Delphi/201311/25102.html