DelphiでPostgreSQLのバイナリデータの読み書き

DelphiでFireDACを使ってPostgreSQLのバイナリデータの読み書きに挑戦した。
PostgreSQLは普段は使用していないので、間違いがあるかもしれない。

使用したアプリケーションのバージョンは下記の通り。

  • Delphiのバージョンは、Delphi XE6
  • PostgreSQLのバージョンは、PostgreSQL 9.3.4(Win x86-32)

テーブルの作成

バイナリデータを保存するテーブルを作成する。
PostgreSQLではバイナリ列はbyteaデータ型に保存するらしい。

create table myImage (jpegByte bytea);

データベースの接続

TFDConnectionを配置して接続できるようにする。
(具体的な手順は省略した)

TFDTableの設定

FTTable1のConnectionプロパティを「FDConnection1」、TableNameプロパティを「myimage」に設定する。

ActiveプロパティをTrueにして接続できることを確認する。

FDTable1のフィールドエディタを開き、「すべてのフィールドを追加」する。
(jpegbyteが追加される。)

01

TBlobFieldのLoadFromFileメソッドでバイナリデータを保存する

TBlobFieldのLoadFromFileメソッドを使ってバイナリデータを保存してみる。

ボタンを押したときのイベントを記述する。
このコードでは、あらかじめ用意しておいたテスト用のJEPGファイル(C:\test\test.jpg)をデータベースに保存している。

procedure TForm1.Button3Click(Sender: TObject);
begin
  if not FDTable1.Active then
    FDTable1.Active := True;

  FDTable1.Append;
  FDTable1jpegbyte.LoadFromFile('C:\test\test.jpg');
  FDTable1.Post;

  FDTable1.Active := False;
end;

TBlogFieldのLoadFromStreamメソッドでバイナリデータを保存する

TBlobFieldのLoadFromStreamメソッドを使ってバイナリデータを保存してみる。

ボタンを押したときのイベントを記述する。
このコードでは、あらかじめ用意しておいたテスト用のJEPGファイル(C:\test\test.jpg)をストリームに読み込んでから、ストリームをLoadFromStreamメソッドでデータベースに保存している。

procedure TForm1.Button4Click(Sender: TObject);
var
  MS: TMemoryStream;
begin
  if not FDTable1.Active then
    FDTable1.Active := True;

  FDTable1.Append;
  MS := TMemoryStream.Create;
  MS.LoadFromFile('C:\test\test.jpg');
  FDTable1jpegbyte.LoadFromStream(MS);
  MS.Free;
  FDTable1.Post;

  FDTable1.Active := False;
end;

TBlobFieldのSaveToFileメソッドでバイナリデータをファイルに保存する

TBlobFieldのSaveToFileメソッドでバイナリデータをファイルに保存してみる。

コードの最後では確認のためTImageコンポーネントに保存した画像を表示している。

procedure TForm1.Button2Click(Sender: TObject);
const
  PATH = 'C:\test\blob.jpg';
begin
  if not FDTable1.Active then
    FDTable1.Active := True;

  FDTable1jpegbyte.SaveToFile(PATH);
  FDTable1.Active := False;
  Image1.Bitmap.LoadFromFile(PATH);
end;

TBlobFieldのSaveToStreamメソッドでバイナリデータにストリームに保存する

TBlobFieldのSaveToFileメソッドでバイナリデータをストリームに保存してみる。

ストリームに保存したバイナリデータは、ファイルに保存してからTImageコンポーネントに表示している。

procedure TForm1.Button5Click(Sender: TObject);
const
  PATH = 'C:\test\blob.jpg';
var
  MS: TMemoryStream;
begin
  if not FDTable1.Active then
    FDTable1.Active := True;

  if TFile.Exists(PATH) then
    TFile.Delete(PATH);
  MS := TMemoryStream.Create;
  FDTable1jpegbyte.SaveToStream(MS);
  FDTable1.Active := False;

  MS.SaveToFile(PATH);
  MS.Free;
  Image1.Bitmap.LoadFromFile(PATH);
end;

TFDQueryでバイナリデータを保存する

バイナリデータを保存するには、TFDParamのLoadFromStreamメソッドを使用する。

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  MS.LoadFromFile('C:\test\test.jpg');
  MS.Seek(0, 0);
  FDQuery1.SQL.Text := 'insert into myImage (jpegByte) values (:bData)';
  FDQuery1.ParamByName('bData').LoadFromStream(MS, ftBlob);
  FDQuery1.ExecSQL;
  MS.Free;
end;

TFDQueryでバイナリデータを読み込む

TFDQueryのCreateBlobStreamメソッドを使用して、バイナリデータをTStreamで取得する。

ストリームのデータは、ファイルに保存してからTImageコンポーネントに表示している。

procedure TForm1.Button6Click(Sender: TObject);
const
  PATH = 'C:\test\blob.jpg';
var
  Stream: TStream;
  MS: TMemoryStream;
begin
  FDQuery1.Open('select jpegByte from myImage');
  FDQuery1.First;
  Stream := FDQuery1.CreateBlobStream(FDQuery1.FieldByName('jpegByte'),
    TBlobStreamMode.bmRead);
  MS := TMemoryStream.Create;
  MS.LoadFromStream(Stream);
  MS.SaveToFile(PATH);
  MS.Free;
  FDQuery1.Close;
  Image1.Bitmap.LoadFromFile(PATH);
end;

コメント

  1. 以下の処理を行うにはuses節に何を記載すればよろしいのでしょうか?

    FDTable1jpegbyte.LoadFromFile

  2. 小宅さん。
    現在Delphiを使っていないためお答えできません。
    docwikiでFDTableなどを調べるとわかるかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください