5
0

More than 1 year has passed since last update.

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

Posted at

はじめに

Delphi Advent Calendar 2022 12/05と12/07と12/08と12/11と12/13の記事のOracle Database Express Edition 版です。

今回は、電子帳簿の管理などで役立つかもの、BLOBに、PDFを保存して、呼び出したPDFをブラウザで、参照する処理を追加しました。

image.png

1. Oracle Database Express Edition は、Windows10にインストール(バージョンは21c)、接続の検証は、A5SQL Mk2 で行いました。

A5SQL Mk2 は、たしか Delphi製だったかと思うのですが、直接接続なるものが設定でき、Oracle Instant Clientは不要で接続できますが、今回は、FireDACでの接続なので、oci.dllなどのdllが、必要なので、Oracle Instant Client を使用します。
image.png

2. Oracle Database Express Edition データベースは XE を使用(変更不可だったと思います?)

a5-2.png

3. Oracle Database Express Edition では、データ型は BLOB です

4. Delphiで、uses ShellAPI, JPEG, GIFImg, PNGImage ; //使用する画像とPDFをブラウザで参照するのでShellAPI も宣言

Delphi 10.2でテストしています。
赤枠の部分が、12/05と12/07と12/08と12/11と12/13 にはなく、今回追加した処理で、今回は追加部の説明を記事にします。
image.png


以下サンプルコード

PDFデータの追加のサンプルコード

FD_Oracle_Express_21c_b_Unit.pas
procedure TForm1.SpeedButton10Click(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_2.Text );
    FDQuery1.ParamByName('tsblob').LoadFromFile( Edit_Files_PDF.Text ,ftBlob);
    FDQuery1.ExecSQL();
    ShowMessage('登録しました');
  finally
    FDQuery1.Close;
  end;
end;

PDFをDBから読込みして、tmp_1.pdfに保存のサンプルコード

FD_Oracle_Express_21c_b_Unit.pas
procedure TForm1.SpeedButton11Click(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_2.Text);
    FDQuery1.Open();
    if not FDQuery1.Eof then
    begin
      Edit_TS_NO_2.Text  :=IntToStr(FDQuery1.FieldByName('ts_no').AsInteger);
      TBLOBField(FDQuery1.FieldByName('tsblob') ).SaveToFile(GetCurrentDir+'\'+'tmp_1.pdf' );
    end;
  finally
    FDQuery1.Close;
  end;
end;

保存したPDFのtmp_1.pdfをクロームで参照するサンプルコード

FD_Oracle_Express_21c_b_Unit.pas
procedure TForm1.SpeedButton12Click(Sender: TObject);
var
  LExeName : String;
  LUrl     : String;
begin
  LExeName := 'chrome.exe';
  LUrl     := 'file:/'+GetCurrentDir+'\'+'tmp_1.pdf';
  ShellExecute(Handle, 'open', PChar(LExeName), PChar(LUrl), nil, SW_SHOW);
end;

Oracle Instant Client
から、下記のdllを実行ファイルに配置して、使用しました、すべて必要なのかどうかは検証していません。
embarcaderoさんのドキュメントOracle サーバーへの接続(FireDACには、4つを配置とあります。
image.png

tnsnames.oraは、Oracle Database Express Edition をインストールした、Windows10からコピーして、今回は、マシン名をIPアドレスに変更してしようしました。
(Oracleをインストールしたマシンの C:\app\w10o\product\21c\homes\OraDB21Home1\network\admin から)
tns.png

tnsnames.ora
# tnsnames.ora Network Configuration File: C:\app\w10o\product\18.0.0\dbhomeXE\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.51)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

LISTENER_XE =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.51)(PORT = 1521))


ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

わかっている方には、当たり前なのかもしれませんが、FireDACで、Oracleに接続する場合、tnsnames.oraが、クライアント側に必要となります。普段PostgreSQLやMySQLを使われていて、はじめて、Oracleに接続するときの、ハマりどころかもしれません。

エラーで、[FireDAC][Phys][Ora]-314. ベンダ ライブラリ [D:\2022_Oracle_Express_21c_B\Win32\Debug\oci.dll] を読み込めません。指定されたモジュールが見つかりません。が表示される場合

ora_err.png
Microsoft Visual C++のランタイムがインストールされていない場合にでるようなので、Microsoft Visual C++再頒布可能な最新のサポートされているダウンロード
からダウンロードとインストールが必要です。

このDelphiのサンプルソースのダウロードは、ここからできます

5
0
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
5
0