| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> delphi >> 基础教程 >> 文章正文
第二十章 开发Delphi对象式数据管理功能(二)            【字体:
第二十章 开发Delphi对象式数据管理功能(二)
作者:不祥    文章来源:-    点击数:    更新时间:2006-12-12

  Seek方法重新设置BLOB流中的指针位置。如果Origin的值是soFromBeginning,则新的指针位置是Offset; 如Origin的值是soFromCurrent,则新的指针位置是Position+Offset;如果Origin的值是SoFromCurrent,则新的指针位置是Size+Offset。函数返回新的指针位置值。当Origin为0(SoFromBegin)时,Offset的值必须大于等于零; 当Origin的值为2(SoFromEnd),Offset的值必须小于等于零。

  4. Truncate方法

  声明:procedure Truncate;

Truncate方法撤消TBlobField、TBytesField或TVarBytesField中从当前位置起的数据。

  5. Create方法

  声明:constructor Create(Field: TBlobField; Mode: TBlobStreamMode);

  Create方法使用Field参数建立BLOB流与BLOB字段的联接。Mode 的值可为bmRead、bmWrite和bmReadWrite。

 

20.1.7.2 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方法实现。

  1. 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数据。

  方法中用到的DbiOpenBlob函数是BDE的API函数,该函数用于打开数据库中的BLOB字段。

上一页  [1] [2] [3] [4] [5] [6] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 第二十章 开发Delphi对象式…

  • 第二十章 开发Delphi对象式…

  • 第二十章 开发Delphi对象式…

  • 第二十章 开发Delphi对象式…

  • 第十九章 Delphi自定义部件…

  • 第十九章 Delphi自定义部件…

  • 第十九章 Delphi自定义部件…

  • 第十九章 Delphi自定义部件…

  • 第十八章 Delphi客户服务器…

  • 第十八章 Delphi客户服务器…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |