首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 第 20 章:開發物件導向資料管理功能(二)─ TBlobStream 讀寫與定位實作詳解

     編輯:Delphi

Read 與 Write 方法的 BDE API 實作

Read 與 Write 方法均呼叫 BDE API 函數完成 BLOB 欄位的讀寫操作。

Read 方法實作

function TBlobStream.Read(var Buffer; Count: Longint): Longint;
var
  Status: DBIResult;
begin
  Result := 0;
  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 使用 DbiGetBlob 從資料集讀取資料。參數含義:FDataSet.Handle 為資料集的 BDE 控制代碼,FRecord 為 BLOB 欄位所在記錄,FFieldNo 為欄位編號,FPosition 為讀取起始位置,Count 為欲讀取位元組數,Buffer 為接收資料的記憶體緩衝區,Result 回傳實際讀取位元組數。方法亦會根據 FField.FTransliterate 呼叫 NativeToAnsiBuf 進行字元集轉換。

Write 方法實作

function TBlobStream.Write(const Buffer; Count: Longint): Longint;
var
  Temp: Pointer;
begin
  Result := 0;
  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 呼叫 DbiPutBlob 寫入 BLOB 欄位。參數對照表:

參數名含義
FDataSet.Handle寫入資料庫的 BDE 控制代碼
FRecord寫入資料的 BLOB 欄位所在記錄
FFieldNoBLOB 欄位編號
FPosition寫入起始位置
Count寫入資料的位元組數
Buffer所寫入資料佔用的記憶體位址

方法會依 FField.FTransliterate 判斷是否執行字元集轉換,最後移動位置指標並設 FModified := True。

Seek 與 GetBlobSize 方法實作

Seek 用於移動 BLOB 流位置指標;GetBlobSize 為私有方法,供 Seek 呼叫以取得 BLOB 資料大小。

function TBlobStream.GetBlobSize: Longint;
begin
  Result := 0;
  if FOpened then
    Check(DbiGetBlobSize(FDataSet.Handle, FRecord, FFieldNo, Result));
end;

function TBlobStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
  case Origin of
    0: FPosition := Offset;           { soFromBeginning }
    1: Inc(FPosition, Offset);        { soFromCurrent }
    2: FPosition := GetBlobSize + Offset; { soFromEnd }
  end;
  Result := FPosition;
end;

GetBlobSize 呼叫 DbiGetBlobSize,參數含義與前述 API 相同。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved