首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

資料表中儲存與讀取圖片:ClientDataSet + Blob 流實作範例

     編輯:關於SqlServer

技術棧與前置條件

  • Delphi / C++Builder (VCL 架構)
  • TClientDataSet (記憶體資料集)
  • ftGraphic 欄位型別 (對應 TGraphicField)
  • 測試圖片:c:\temp\test1.bmp, c:\temp\test2.bmp

完整實作程式碼

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBClient;

type
  TForm1 = class(TForm)
    ClientDataSet1: TClientDataSet;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  PicPath1 = 'c:\temp\test1.bmp';
  PicPath2 = 'c:\temp\test2.bmp';

procedure TForm1.FormCreate(Sender: TObject);
begin
  { 建立資料表結構 }
  with ClientDataSet1 do begin
    FieldDefs.Add('Name', ftWideString, 8);
    FieldDefs.Add('Age', ftInteger);
    FieldDefs.Add('Picture', ftGraphic);  // 圖片欄位
    CreateDataSet;
  end;

  { 新增第一筆資料 }
  ClientDataSet1.Append;
  ClientDataSet1['Name'] := '張三';
  ClientDataSet1['Age'] := 66;
  TGraphicField(ClientDataSet1.FieldByName('Picture')).LoadFromFile(PicPath1);
  ClientDataSet1.Post;

  { 新增第二筆資料 }
  ClientDataSet1.Append;
  ClientDataSet1['Name'] := '李四';
  ClientDataSet1['Age'] := 16;
  TGraphicField(ClientDataSet1.FieldByName('Picture')).LoadFromFile(PicPath2);
  ClientDataSet1.Post;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  BlobStream: TClientBlobStream;
  GraphicField: TGraphicField;
  Bitmap: TBitmap;
begin
  { 查找指定記錄 }
  if ClientDataSet1.Locate('Name', '李四', []) then
  begin
    { 取得 Graphic 欄位 }
    GraphicField := ClientDataSet1.FieldByName('Picture') as TGraphicField;

    { 建立 Blob 讀取流 }
    BlobStream := TClientBlobStream.Create(GraphicField, bmRead);
    try
      { 載入至 TBitmap 顯示 }
      Bitmap := TBitmap.Create;
      try
        Bitmap.LoadFromStream(BlobStream);
        Canvas.Draw(10, 10, Bitmap);  // 直接繪於表單畫布示範
      finally
        Bitmap.Free;
      end;
    finally
      BlobStream.Free;
    end;
  end;
end;

end.

關鍵技術點解析

  1. ftGraphic vs ftBlob:ftGraphic 專為圖形物件 (TPicture/TGraphic) 設計,自動處理圖檔標頭;ftBlob 為通用二進位資料,需自行管理格式。
  2. TGraphicField.LoadFromFile:直接讀取圖檔寫入欄位,內部轉換為 Blob 儲存。
  3. TClientBlobStream:ClientDataSet 專用的 Blob 流封裝,建構子參數 bmRead/bmWrite/bmReadWrite 決定存取模式。
  4. TBitmap.LoadFromStream:從流還原位圖,支援 BMP/JPEG/PNG 等 TGraphic 註冊格式。
  5. 資源管理:嚴格使用 try...finally 釋放流與位圖物件,避免記憶體洩漏。

擴充應用場景

  • 資料庫持久化:ClientDataSet 可透過 TDataSetProvider + TSQLConnection 將含圖片資料寫入 SQL Server VARBINARY(MAX) / IMAGE 欄位。
  • 多圖片欄位:在 FieldDefs 中新增多個 ftGraphic 欄位,同樣流程處理。
  • 壓縮儲存:寫入前先用 TJPEGImage 壓縮再 SaveToStream,大幅減少空間。
  • 非同步載入:大圖讀取時放入背景執行緒,避免 UI 凍結。

注意事項

  • ClientDataSet 為記憶體資料集,資料量大時記憶體壓力大,生產環境建議直接操作資料庫 Blob 欄位 (參考 TBlobField / TStream)。
  • 圖片檔案路徑建議使用相對路徑或設定檔管理,避免硬編碼。
  • Locate 區分大小寫視 Options 屬性而定,實務上常搭配主鍵查找。

總結

利用 TClientDataSet 的 ftGraphic 欄位搭配 TGraphicField.LoadFromFile 與 TClientBlobStream,可輕鬆實現圖片在記憶體資料集中的儲存、讀取與顯示。此模式適用於桌面應用的離線資料處理、報表列印預覽、本地快取等場景。

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