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

# はじめに
## Delphi Advent Calendar 2022 12/05の記事のSQLite3版です。  

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

### 2.　DB Browser for SQLiteをインストールしてるので、SQLite Version 3.35.5.
![01_dbbrowser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/40801284-d50b-fe5b-07fa-40e95584b72f.png)

### 3.　SQLite3では、データ型は　BLOBです
```Delphi: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/3a181fe1-a950-9075-f139-b48c574f48d5.png)
実行するファイルパスに、データベースファイルは、まだ、存在していません
![03_2022_SQLite3_B_Win32_Debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/17b08208-471c-97c4-7c6c-33b39c721be9.png)
接続　すると　データベースファイルが、作成されます
![06_2022_SQLite3_B_Win32_Debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/bd9d0c92-4166-dc9c-e1fd-3713b453a09e.png)
***
#### 以下サンプルコード

### 画像データの追加のサンプルコード　(12/05の記事のPostgreSQL版と同様です)
```Delphi: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版と同様です)
```Delphi: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　ファイルが作成されます。
使用するデータベースファイルのパスに注意しないと、意図しない場所に保存されるかもしれないので、データベースファイルのパスを意識して、作成するのが注意点なのかもしれません。

```Delphi: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://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/63f41008-5caf-81ee-7799-ca419fc0d7cd.png)
https://www.embarcadero.com/jp/products/rad-studio/firedac

[Delphi Community Edition](https://www.embarcadero.com/jp/products/delphi/starter)では、ローカル接続は使用できるようですが、PostgreSQLなどのOSS版には、リモート接続も限定的にでも試用できると、ありがたい方も、多いような気もします。

#### もう少し細かい手順とソースのダウロードは、ここからできます
http://a23.sblo.jp/article/189968174.html?1670120363