知识大全 开发Delphi对象式数据管理功能(二)[2]

Posted 指针

篇首语:学习并不等于就是摹仿某些东西,而是掌握技巧和方法。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 开发Delphi对象式数据管理功能(二)[2]相关的知识,希望对你有一定的参考价值。

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   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方法撤消TBlobField TBytesField或TVarBytesField中从当前位置起的数据

   Create方法

  声明

constructor Create(Field: TBlobField; Mode: TBlobStreamMode)

  Create方法使用Field参数建立BLOB流与BLOB字段的联接 Mode 的值可为bmRead bmWrite和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 TBlobStream Create(Field: TBlobField; Mode: TBlobStreamMode)

  var

  OpenMode: DbiOpenMode;

  begin

  FField := Field;

  FDataSet := Field DataSet;

  FRecord := FDataSet ActiveBuffer;

  FFieldNo := Field FieldNo;

  if FDataSet State = dsFilter then

  DBErrorFmt(SNoFieldAccess [FField DisplayName])

  if not FField FModified then

  begin

  if Mode = bmRead then

  begin

  FBuffer := AllocMem(FDataSet RecordSize)

  FRecord := FBuffer;

  if not FDataSet GetCurrentRecord(FBuffer) then Exit;

  OpenMode := dbiReadOnly;

  end else

  begin

  if not (FDataSet State in [dsEdit dsInsert]) then DBError(SNotEditing)

  OpenMode := dbiReadWrite;

  end;

  Check(DbiOpenBlob(FDataSet Handle FRecord FFieldNo OpenMode))

  end;

  FOpened := True;

  if Mode = bmWrite then Truncate;

  end;

  该方法首先是用传入的Field参数给FField FDataSet FRecord和FFieldNo赋值 方法中用AllocMem按当前记录大小分配内存 并将指针赋给FBuffer 用DataSet部件的GetCurrentRecord方法 将记录的值赋给FBuffer 但不包括BLOB数据

cha138/Article/program/Delphi/201311/25101

相关参考

知识大全 开发Delphi对象式数据管理功能(二)[3]

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(二)[1]

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(一)[2]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(三)[2]

DELPHI基础教程:开发Delphi对象式数据管理功能(三)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(四)[2]

DELPHI基础教程:开发Delphi对象式数据管理功能(四)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(五)[2]

DELPHI基础教程:开发Delphi对象式数据管理功能(五)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(一)[3]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(一)[5]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(一)[4]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(一)[1]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快