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

Delphi 資料庫 BLOB 欄位應用:串流、圖像與文字資料完整操作指南

     編輯:Delphi

20.3.2 資料庫 BLOB 欄位應用

TBlobStream 讓 Delphi 應用充分發揮多媒體資料庫管理能力,同時保留 Object Pascal 底層控制與擴展彈性。

20.3.2.1 TBlobStream 使用範例

以 TBlobField 建立 BLOB 串流,搭配 TWriter/TReader 實現超媒體卡片儲存與讀取:

{ 儲存 }
BlobStream := TBlobStream.Create(TBlobField(CardTable.Fields[10]), bmWrite);
with TWriter.Create(BlobStream, 4096) do
try
  for I := 0 to DesignWin.ControlCount - 1 do
  begin
    WriteInteger(MMID[I]);
    WriteRootComponent(DesignWin.Controls[I]);
  end;
  WriteListEnd;
finally Free; end;
BlobStream.Free; CardTable.Post;

{ 讀取 }
BlobStream := TBlobStream.Create(TBlobField(CardTable.Fields[10]), bmRead);
with TReader.Create(BlobStream, 4096) do
try
  while not EndOfList do
    case ReadInteger of
      IDText: begin
        Ctrl := TControl(ReadRootComponent(nil));
        { 重新連接 OnClick 事件 }
        PropInfo := GetPropInfo(Ctrl.ClassInfo, 'OnClick');
        Method.Code := Self.MethodAddress(MethodName);
        Method.Data := Self;
        if Method.Code <> nil then SetMethodProp(Ctrl, PropInfo, Method);
        DesignWin.InsertControl(Ctrl);
      end;
      IDImage: ...;
    end;
finally Free; end;

Fields[10] 為 BLOB 欄位,Post 回寫資料庫。讀取時需重新連接事件處理程序(SetMethodProp 或 TReader.OnFindMethod)。

20.3.2.2 BLOB 欄位與圖形圖像

TBlobField 提供 LoadFromBitmap/SaveToBitmap,內部使用 TBlobStream。兩種儲存格式:

  • 位圖資料:串流位置 0 開始
  • 圖形/其他 BLOB:位置 SizeOf(TGraphicHeader)+1 開始,含標頭資訊
procedure TBlobField.LoadFromBitmap(Bitmap: TBitmap);
var BlobStream: TBlobStream; Header: TGraphicHeader;
begin
  BlobStream := TBlobStream.Create(Self, bmWrite);
  try
    if (DataType = ftGraphic) or (DataType = ftTypedBinary) then
    begin
      Header.Count := 1; Header.HType := $0100; Header.Size := 0;
      BlobStream.Write(Header, SizeOf(Header));
      Bitmap.SaveToStream(BlobStream);
      Header.Size := BlobStream.Position - SizeOf(Header);
      BlobStream.Position := 0;
      BlobStream.Write(Header, SizeOf(Header));
    end else Bitmap.SaveToStream(BlobStream);
  finally BlobStream.Free; end;
end;

20.3.2.3 BLOB 欄位與文字

LoadFromStrings/SaveToStrings 實現 TBlobField 與 TStrings 自由轉換,核心同樣委派給 TBlobStream:

procedure TBlobField.LoadFromStrings(Strings: TStrings);
var BlobStream: TBlobStream;
begin
  BlobStream := TBlobStream.Create(Self, bmWrite);
  try Strings.SaveToStream(BlobStream); finally BlobStream.Free; end;
end;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved