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数据
[] [] [] []