7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DelphiAdvent Calendar 2022

Day 5

Delphi / FireDAC PostgreSQLで、画像の保存と取り出しのテストをしてみました。     

Last updated at Posted at 2022-12-04

はじめに

PostgreSQLでの、画像の保存と取り出しのサンプルコードが、自分は、うまく検索できなかったので、PostgreSQL15とUbuntu22.04LTS環境で、実行してみました。

1. Ubuntu22.04LTS はローカルの機器にインストール

2. PostgreSQLは最新の15をインストール

3. PostgreSQLでは、データ型は BLOBではなく BYTEA 

FD_PostgreSQL15_b_Unit.pas の Create SQL文
  sqlstmt:='CREATE TABLE test_tbl '+
  '('+
  'ID         serial,'+
  'TS_NO      INTEGER  not null,'+
  'TS_NAME    TEXT ,'+
  'TS_QTY     DECIMAL(14,2) Default 0 ,'+
  'TSBLOB     BYTEA ,'+    //BLOBに該当
  'TSBLOB2    oid,'+	   //こちらも使えるようです
  'primary key(TS_NO)'+
  ')';

4. Delphiで、uses JPEG, GIFImg, PNGImage ; //使用する画像を宣言

Delphi 10.2でテストしています。

11_IDE.png


以下サンプルコード

画像データの追加のサンプルコード

FD_PostgreSQL15_b_Unit.pas
procedure TForm1.SpeedButton6Click(Sender: TObject);
var
  SQLstmt:String;
begin
  with FDConnection1 do
  try
    SQLstmt :=' INSERT INTO '
             +' test_tbl ( ts_no  , tsblob ) '
             +'	VALUES ('
             +' :ts_no , :tsblob '
             + ')';
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text:= sqlstmt;
    FDQuery1.ParamByName('ts_no').AsInteger:=StrToInt( Edit_TS_NO.Text );  //オープンした画像ファイル名
    FDQuery1.ParamByName('tsblob').LoadFromFile( Edit_Files.Text ,ftBlob);
    FDQuery1.ExecSQL();
    ShowMessage('登録しました');
  finally
    FDQuery1.Close;
  end;
end;

画像データの表示のサンプルコード

FD_PostgreSQL15_b_Unit.pas
procedure TForm1.SpeedButton7Click(Sender: TObject);
var
  SQLstmt:String;
begin
  with FDConnection1 do
  try
    SQLstmt := 'SELECT * FROM test_tbl '
            +  'WHERE ts_no = :ts_no';
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Text:= sqlstmt;
    FDQuery1.ParamByName('ts_no').AsInteger:=StrToInt(Edit_ts_no.Text);
    FDQuery1.Open();
    if not FDQuery1.Eof then
    begin
      Edit_ts_no.Text  :=IntToStr(FDQuery1.FieldByName('ts_no').AsInteger);
      Image1.Picture.Assign( TBLOBField(FDQuery1.FieldByName('tsblob') ) );    //保存した画像ファイルを表示
    end;
  finally
    FDQuery1.Close;
  end;
end;
画像データの追加のポイント

 FDQuery1.ParamByName(フィールド名).LoadFromFile( 画像ファイル名 ,ftBlob);
 FDQuery1.ParamByName('tsblob').LoadFromFile( Edit_Files.Text ,ftBlob);

画像データの表示のポイント

 Image1.Picture.Assign( TBLOBField(FDQuery1.FieldByName('フィールド名') ) );
 Image1.Picture.Assign( TBLOBField(FDQuery1.FieldByName('tsblob') ) );


簡単な、サンプルですが、画像をいままで、あまり扱ってこなっかったので、実行するのに時間がかかりました。
開発言語の人気の順位は、疑問対する解答(実現したいことに対すのサンプル)の多さでも、決まるような気もしますので、簡単なコードですが、多少なりともDelphi界隈の貢献となれば幸いです。

もう少し細かい手順とソースのダウロードは、ここからできます

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?