Write方法
聲明
function Write(const Buffer; Count: Longint)
override; Longint;
Write方法從Buffer中向數據庫域的當前位置復制Count個字節的內容Buffer必須分配有Count個字節的內存空間函數返回實際傳輸的字節數傳輸過程也要進行選擇符邊界判斷
Seek方法
聲明
function Seek(Offset: Longint; Origin: Word)
Longint;
Seek方法重新設置BLOB流中的指針位置如果Origin的值是soFromBeginning則新的指針位置是Offset; 如Origin的值是soFromCurrent則新的指針位置是Position+Offset;如果Origin的值是SoFromCurrent則新的指針位置是Size+Offset函數返回新的指針位置值當Origin為(SoFromBegin)時Offset的值必須大於等於零 當Origin的值為(SoFromEnd)Offset的值必須小於等於零
Truncate方法
聲明
procedure Truncate;
Truncate方法撤消TBlobFieldTBytesField或TVarBytesField中從當前位置起的數據
Create方法
聲明
constructor Create(Field: TBlobField; Mode: TBlobStreamMode)
Create方法使用Field參數建立BLOB流與BLOB字段的聯接Mode 的值可為bmReadbmWrite和bmReadWrite
TBlobStream的實現原理
說明TBlobStream對象的實現原理不可避免地要涉及它的私有域下面是私有域的定義
TBlobStream = class(TStream)
private
FField: TBlobField;
FDataSet: TDataSet;
FRecord: PChar;
FBuffer: PChar;
FFieldNo: Integer;
FOpened: Boolean;
FModified: Boolean;
FPosition: Longint;
…
public
…
end;
FField是與BLOB流相聯的數據庫BLOB域該域用於BLOB流的內部訪問FDataSet是代表FField所在的數據庫它可以是TTable部件也可以是TQuery 部件FRecord和FBuffer都是BLOB流內部使用的緩沖區用於存儲FField所在記錄的數據該數據記錄中不包含BLOB數據TBlobStream使用FRecord作為調用BDE API函數的參數值FFieldNo代表BLOB字段的字段號也用於BDE API的參數傳遞FOpened和FMocified都是狀態信息FPosition表示BLOB流的當前位置下面介紹TBlobStream方法實現
Create方法和Destroy方法的實現
Create方法的功能主要是建立BlobStream流與BLOB字段的聯系並初始化某些私有變量其實現如下
constructor TBlobStreamCreate(Field: TBlobField; Mode: TBlobStreamMode)
var
OpenMode: DbiOpenMode;
begin
FField := Field;
FDataSet := FieldDataSet;
FRecord := FDataSetActiveBuffer;
FFieldNo := FieldFieldNo;
if FDataSetState = dsFilter then
DBErrorFmt(SNoFieldAccess [FFieldDisplayName])
if not FFieldFModified then
begin
if Mode = bmRead then
begin
FBuffer := AllocMem(FDataSetRecordSize)
FRecord := FBuffer;
if not FDataSetGetCurrentRecord(FBuffer) then Exit;
OpenMode := dbiReadOnly;
end else
begin
if not (FDataSetState in [dsEdit dsInsert]) then DBError(SNotEditing)
OpenMode := dbiReadWrite;
end;
Check(DbiOpenBlob(FDataSetHandle FRecord FFieldNo OpenMode))
end;
FOpened := True;
if Mode = bmWrite then Truncate;
end;
該方法首先是用傳入的Field參數給FFieldFDataSetFRecord和FFieldNo賦值方法中用AllocMem按當前記錄大小分配內存並將指針賦給FBuffer用DataSet部件的GetCurrentRecord方法將記錄的值賦給FBuffer但不包括BLOB數據
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25101.html