DelphiでFireDACを使ってPostgreSQLのバイナリデータの読み書きに挑戦した。
PostgreSQLは普段は使用していないので、間違いがあるかもしれない。
使用したアプリケーションのバージョンは下記の通り。
- Delphiのバージョンは、Delphi XE6
- PostgreSQLのバージョンは、PostgreSQL 9.3.4(Win x86-32)
テーブルの作成
バイナリデータを保存するテーブルを作成する。
PostgreSQLではバイナリ列はbyteaデータ型に保存するらしい。
create table myImage (jpegByte bytea);
データベースの接続
TFDConnectionを配置して接続できるようにする。
(具体的な手順は省略した)
TFDTableの設定
FTTable1のConnectionプロパティを「FDConnection1」、TableNameプロパティを「myimage」に設定する。
ActiveプロパティをTrueにして接続できることを確認する。
FDTable1のフィールドエディタを開き、「すべてのフィールドを追加」する。
(jpegbyteが追加される。)
TBlobFieldのLoadFromFileメソッドでバイナリデータを保存する
TBlobFieldのLoadFromFileメソッドを使ってバイナリデータを保存してみる。
ボタンを押したときのイベントを記述する。
このコードでは、あらかじめ用意しておいたテスト用のJEPGファイル(C:\test\test.jpg)をデータベースに保存している。
procedure TForm1.Button3Click(Sender: TObject);
begin
if not FDTable1.Active then
FDTable1.Active := True;
FDTable1.Append;
FDTable1jpegbyte.LoadFromFile('C:\test\test.jpg');
FDTable1.Post;
FDTable1.Active := False;
end;
TBlogFieldのLoadFromStreamメソッドでバイナリデータを保存する
TBlobFieldのLoadFromStreamメソッドを使ってバイナリデータを保存してみる。
ボタンを押したときのイベントを記述する。
このコードでは、あらかじめ用意しておいたテスト用のJEPGファイル(C:\test\test.jpg)をストリームに読み込んでから、ストリームをLoadFromStreamメソッドでデータベースに保存している。
procedure TForm1.Button4Click(Sender: TObject);
var
MS: TMemoryStream;
begin
if not FDTable1.Active then
FDTable1.Active := True;
FDTable1.Append;
MS := TMemoryStream.Create;
MS.LoadFromFile('C:\test\test.jpg');
FDTable1jpegbyte.LoadFromStream(MS);
MS.Free;
FDTable1.Post;
FDTable1.Active := False;
end;
TBlobFieldのSaveToFileメソッドでバイナリデータをファイルに保存する
TBlobFieldのSaveToFileメソッドでバイナリデータをファイルに保存してみる。
コードの最後では確認のためTImageコンポーネントに保存した画像を表示している。
procedure TForm1.Button2Click(Sender: TObject);
const
PATH = 'C:\test\blob.jpg';
begin
if not FDTable1.Active then
FDTable1.Active := True;
FDTable1jpegbyte.SaveToFile(PATH);
FDTable1.Active := False;
Image1.Bitmap.LoadFromFile(PATH);
end;
TBlobFieldのSaveToStreamメソッドでバイナリデータにストリームに保存する
TBlobFieldのSaveToFileメソッドでバイナリデータをストリームに保存してみる。
ストリームに保存したバイナリデータは、ファイルに保存してからTImageコンポーネントに表示している。
procedure TForm1.Button5Click(Sender: TObject);
const
PATH = 'C:\test\blob.jpg';
var
MS: TMemoryStream;
begin
if not FDTable1.Active then
FDTable1.Active := True;
if TFile.Exists(PATH) then
TFile.Delete(PATH);
MS := TMemoryStream.Create;
FDTable1jpegbyte.SaveToStream(MS);
FDTable1.Active := False;
MS.SaveToFile(PATH);
MS.Free;
Image1.Bitmap.LoadFromFile(PATH);
end;
TFDQueryでバイナリデータを保存する
バイナリデータを保存するには、TFDParamのLoadFromStreamメソッドを使用する。
procedure TForm1.Button1Click(Sender: TObject);
var
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
MS.LoadFromFile('C:\test\test.jpg');
MS.Seek(0, 0);
FDQuery1.SQL.Text := 'insert into myImage (jpegByte) values (:bData)';
FDQuery1.ParamByName('bData').LoadFromStream(MS, ftBlob);
FDQuery1.ExecSQL;
MS.Free;
end;
TFDQueryでバイナリデータを読み込む
TFDQueryのCreateBlobStreamメソッドを使用して、バイナリデータをTStreamで取得する。
ストリームのデータは、ファイルに保存してからTImageコンポーネントに表示している。
procedure TForm1.Button6Click(Sender: TObject);
const
PATH = 'C:\test\blob.jpg';
var
Stream: TStream;
MS: TMemoryStream;
begin
FDQuery1.Open('select jpegByte from myImage');
FDQuery1.First;
Stream := FDQuery1.CreateBlobStream(FDQuery1.FieldByName('jpegByte'),
TBlobStreamMode.bmRead);
MS := TMemoryStream.Create;
MS.LoadFromStream(Stream);
MS.SaveToFile(PATH);
MS.Free;
FDQuery1.Close;
Image1.Bitmap.LoadFromFile(PATH);
end;
以下の処理を行うにはuses節に何を記載すればよろしいのでしょうか?
FDTable1jpegbyte.LoadFromFile
小宅さん。
現在Delphiを使っていないためお答えできません。
docwikiでFDTableなどを調べるとわかるかもしれません。