Read 與 Write 方法均呼叫 BDE API 函數完成 BLOB 欄位的讀寫操作。
function TBlobStream.Read(var Buffer; Count: Longint): Longint;
var
Status: DBIResult;
begin
Result := 0;
if FOpened then
begin
Status := DbiGetBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,
Count, @Buffer, Result);
case Status of
DBIERR_NONE, DBIERR_ENDOFBLOB:
begin
if FField.FTransliterate then
NativeToAnsiBuf(FDataSet.Locale, @Buffer, @Buffer, Result);
Inc(FPosition, Result);
end;
DBIERR_INVALIDBLOBOFFSET: { Nothing };
else
DbiError(Status);
end;
end;
end;
Read 使用 DbiGetBlob 從資料集讀取資料。參數含義:FDataSet.Handle 為資料集的 BDE 控制代碼,FRecord 為 BLOB 欄位所在記錄,FFieldNo 為欄位編號,FPosition 為讀取起始位置,Count 為欲讀取位元組數,Buffer 為接收資料的記憶體緩衝區,Result 回傳實際讀取位元組數。方法亦會根據 FField.FTransliterate 呼叫 NativeToAnsiBuf 進行字元集轉換。
function TBlobStream.Write(const Buffer; Count: Longint): Longint;
var
Temp: Pointer;
begin
Result := 0;
if FOpened then
begin
if FField.FTransliterate then
begin
GetMem(Temp, Count);
try
AnsiToNativeBuf(FDataSet.Locale, @Buffer, Temp, Count);
Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,
Count, Temp));
finally
FreeMem(Temp, Count);
end;
end
else
Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,
Count, @Buffer));
Inc(FPosition, Count);
Result := Count;
FModified := True;
end;
end;
Write 呼叫 DbiPutBlob 寫入 BLOB 欄位。參數對照表:
| 參數名 | 含義 |
|---|---|
| FDataSet.Handle | 寫入資料庫的 BDE 控制代碼 |
| FRecord | 寫入資料的 BLOB 欄位所在記錄 |
| FFieldNo | BLOB 欄位編號 |
| FPosition | 寫入起始位置 |
| Count | 寫入資料的位元組數 |
| Buffer | 所寫入資料佔用的記憶體位址 |
方法會依 FField.FTransliterate 判斷是否執行字元集轉換,最後移動位置指標並設 FModified := True。
Seek 用於移動 BLOB 流位置指標;GetBlobSize 為私有方法,供 Seek 呼叫以取得 BLOB 資料大小。
function TBlobStream.GetBlobSize: Longint;
begin
Result := 0;
if FOpened then
Check(DbiGetBlobSize(FDataSet.Handle, FRecord, FFieldNo, Result));
end;
function TBlobStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
case Origin of
0: FPosition := Offset; { soFromBeginning }
1: Inc(FPosition, Offset); { soFromCurrent }
2: FPosition := GetBlobSize + Offset; { soFromEnd }
end;
Result := FPosition;
end;
GetBlobSize 呼叫 DbiGetBlobSize,參數含義與前述 API 相同。