はじめに
Delphi Advent Calendar 2022 12/05の記事のSQLite3版です。
1. Windows10 の ローカル接続で実行。
2. DB Browser for SQLiteをインストールしてるので、SQLite Version 3.35.5.
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でテストしています。
実行するファイルパスに、データベースファイルは、まだ、存在していません
接続 すると データベースファイルが、作成されます
以下サンプルコード
画像データの追加のサンプルコード (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
https://www.embarcadero.com/jp/products/rad-studio/firedac
Delphi Community Editionでは、ローカル接続は使用できるようですが、PostgreSQLなどのOSS版には、リモート接続も限定的にでも試用できると、ありがたい方も、多いような気もします。
もう少し細かい手順とソースのダウロードは、ここからできます