はじめに
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でテストしています。
以下サンプルコード
画像データの追加のサンプルコード
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界隈の貢献となれば幸いです。
もう少し細かい手順とソースのダウロードは、ここからできます