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 7

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

Posted at

はじめに

Delphi Advent Calendar 2022 12/05の記事のSQLite3版です。

1. Windows10 の ローカル接続で実行。

2. DB Browser for SQLiteをインストールしてるので、SQLite Version 3.35.5.

01_dbbrowser.png

3. SQLite3では、データ型は BLOBです

FD_SQLite3_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     BLOB,'+
  'primary key(TS_NO)'+
  ')';

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

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

02_ide.png
実行するファイルパスに、データベースファイルは、まだ、存在していません
03_2022_SQLite3_B_Win32_Debug.png
接続 すると データベースファイルが、作成されます
06_2022_SQLite3_B_Win32_Debug.png


以下サンプルコード

画像データの追加のサンプルコード (12/05の記事のPostgreSQL版と同様です)

FD_SQLite3_b_Unit.pas.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;

画像データの表示のサンプルコード (12/05の記事のPostgreSQL版と同様です)

FD_SQLite3_b_Unit.pas.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;

12/05のPostgreSQL版との相違

CreateDatabase と 接続 の手順

SQLite3使用時に、事前にdatabaseを準備されるもの、オッケーなんですが、今回のサンプルのように、test_1.sqlite3 として、接続すると、test_1.sqlite3 ファイルが作成されます。
使用するデータベースファイルのパスに注意しないと、意図しない場所に保存されるかもしれないので、データベースファイルのパスを意識して、作成するのが注意点なのかもしれません。

FD_SQLite3_b_Unit.pas.pas
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  FDConnection1.Params.Values['Server']      :=LabeledEdit1.Text;
  if LabeledEdit1.Text='127.0.0.1' then
    FDConnection1.Params.Values['Database'] := GetCurrentDir+'\'+LabeledEdit2.Text // 'sq3_sales.s3db');   //System.IOUtils
  else
    FDConnection1.Params.Values['Database']    :=LabeledEdit2.Text;

//  FDConnection1.Params.Values['User_Name']   :=LabeledEdit3.Text;
//  FDConnection1.Params.Values['Password']    :=LabeledEdit4.Text;
//  FDConnection1.Params.Values['CharacterSet']:=LabeledEdit5.Text;
  FDConnection1.Params.Values['OpenMode']:=LabeledEdit5.Text;
  FDPhysSQLiteDriverLink1.VendorLib              :=LabeledEdit6.Text;
  FDConnection1.Params.Values['Port']        :=LabeledEdit7.Text;


  FDConnection1.Connected:=True;
  if FDConnection1.Connected=True  then Label1.Caption:='Connect Success'
  else                                  Label1.Caption:='Not connected';
end;

簡単な、サンプルです、12/05と同様の処理ですが、異なるデータベースを使用することによって、開発言語、データベースなどのインフラの部分も、学びが増えるような気がします。
FireDAC

image.png
https://www.embarcadero.com/jp/products/rad-studio/firedac

Delphi Community Editionでは、ローカル接続は使用できるようですが、PostgreSQLなどのOSS版には、リモート接続も限定的にでも試用できると、ありがたい方も、多いような気もします。

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

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?