熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:開發Delphi對象式數據管理功能(二)[2]

2013-11-23 17:47:54  來源: Delphi編程 

   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數據

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25101.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.