知识大全 开发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基础教程:开发Delphi对象式数据管理功能(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(二)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(三)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(四)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(五)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[5] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快