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

Posted 函数

篇首语:勿以恶小而为之,勿以善小而不为。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 开发Delphi对象式数据管理功能(二)[3]相关的知识,希望对你有一定的参考价值。

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

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

  最后如果方法传入的Mode参数值为bmWrite 就调用Truncate将当前位置指针以后的

  数据删除

  分析这段源程序不难知道

  ● 读写BLOB字段 不允许BLOB字段所在DataSet部件有Filter 否则产生异常事件

  ● 要读写BLOB字段 必须将DataSet设为编辑或插入状态

  ● 如果BLOB字段中的数据作了修改 则在创建BLOB 流时 不再重新调用DBiOpenBlob函数 而只是简单地将FOpened置为True 这样可以用多个BLOB 流对同一个BLOB字段读写

  Destroy方法释放BLOB字段和为FBuffer分配的缓冲区 其实现如下

  destructor TBlobStream Destroy;

  begin

  if FOpened then

  begin

  if FModified then FField FModified := True;

  if not FField FModified then

  DbiFreeBlob(FDataSet Handle FRecord FFieldNo)

  end;

  if FBuffer <> nil then FreeMem(FBuffer FDataSet RecordSize)

  if FModified then

  try

  FField DataChanged;

  except

  Application HandleException(Self)

  end;

  end;

  如果BLOB流中的数据作了修改 就将FField的FModified置为True;如果FField的Modified为False就释放BLOB字段 如果FBuffer不为空 则释放临时内存 最后根据FModified的值来决定是否启动FField的事件处理过程DataChanged

  不难看出 如果BLOB字段作了修改就不释放BLOB字段 并且对BLOB 字段的修改只有到Destroy时才提交 这是因为读写BLOB字段时都避开了FField 而直接调用BDE API函数 这一点是在应用BDE API编程中很重要 即一定要修改相应数据库部件的状态

   Read和Write方法的实现

  Read和Write方法都调用BDE API函数完成数据库BLOB字段的读写 其实现如下

  function TBlobStream Read(var Buffer; Count: Longint) Longint;

  var

  Status: DBIResult;

  begin

  Result := ;

  if FOpened then

  begin

  Status := DbiGetBlob(FDataSet Handle FRecord FFieldNo FPosition

  Count @Buffer Result)

  case Status of

  DBIERR_NONE DBIERR_ENDOFBLOB:

  begin

  if FField FTransliterate then

  NativeToAnsiBuf(FDataSet Locale @Buffer @Buffer Result)

  Inc(FPosition Result)

  end;

  DBIERR_INVALIDBLOBOFFSET:

  Nothing;

  else

  DbiError(Status)

  end;

  end;

  end;

  Read方法使用了BDE API的DbiGetBlob函数从FDataSet中读取数据 在本函数中 各参数的含义是这样的 FDataSet Handle代表DataSet的BDE句柄 FReacord表示BLOB字段所在记录 FFieldNo表示BLOB字段号 FPosition表示要读的的数据的起始位置 Count表示要读的字节数 Buffer是读出数据所占的内存 Result是实际读出的字节数 该BDE函数返回函数调用的错误状态信息

  Read方法还调用了NativeToAnsiBuf进行字符集的转换

  function TBlobStream Write(const Buffer; Count: Longint) Longint;

  var

  Temp: Pointer;

  begin

  Result := ;

  if FOpened then

  begin

  if FField FTransliterate then

  begin

  GetMem(Temp Count)

  try

  AnsiToNativeBuf(FDataSet Locale @Buffer Temp Count)

  Check(DbiPutBlob(FDataSet Handle FRecord FFieldNo FPosition

  Count Temp))

  finally

  FreeMem(Temp Count)

  end;

  end else

  Check(DbiPutBlob(FDataSet Handle FRecord FFieldNo FPosition

  Count @Buffer))

  Inc(FPosition Count)

  Result := Count;

  FModified := True;

  end;

  end;

  Write方法调用了BDE API的DbiPutBlob函数实现往数据库BLOB字段存储数据

  该函数的各参数含义如下

  表 调用函数DbiPutBlob的各传入参数的含义

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  参数名           含义

  ──────────────────────────────

  FDataSetHandle 写入的数据库的BDE句柄

  FRecord 写入数据的BLOB字段所在的记录

  FFieldNo BLOB字段号

  FPosition 写入的起始位置

  Count 写入的数据的字节数

  Buffer 所写入的数据占有的内存地址

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  方法中还根据FField和FTransliterate的值判断是否进行相应的字符集转换 最后移动BLOB流的位置指针 并将修改标志FModified置为True

   Seek和GetBlobSize方法的实现

  Seek方法的功能主要是移动BLOB流的位置指针 GetBlobSize方法是私有的 在Seek方法中被调用 其功能是得到BLOB数据的大小 它们的实现如下

  function TBlobStream GetBlobSize: Longint;

  begin

  Result := ;

  if FOpened then

  Check(DbiGetBlobSize(FDataSet Handle FRecord FFieldNo Result))

  end;

  function TBlobStream Seek(Offset: Longint; Origin: Word) Longint;

  begin

  case Origin of

   : FPosition := Offset;

   : Inc(FPosition Offset)

   : FPosition := GetBlobSize + Offset;

  end;

  Result := FPosition;

  end;

  GetBlobSize调用了BDE API的DbiGetBlobSize函数 该函数的参数的含义同前面的API函数相同

cha138/Article/program/Delphi/201311/25102

相关参考

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

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

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

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

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

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

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

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

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

DELPHI基础教程:开发Delphi对象式数据管理功能(四)[3]  以下文字资料是由(全榜网网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对象式数据管理功能(一)[2]

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

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

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