其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[2]


发布日期:2019年02月17日
 
DELPHI基础教程:开发Delphi对象式数据管理功能(二)[2]

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

[] [] [] []

               

上一篇:DELPHI基础教程:开发Delphi对象式数据管理功能(二)[3]

下一篇:DELPHI基础教程:开发Delphi对象式数据管理功能(二)[1]