はじめに
Delphi Advent Calendar 2022 12/05と12/07と12/08と12/11と12/13の記事のOracle Database Express Edition 版です。
今回は、電子帳簿の管理などで役立つかもの、BLOBに、PDFを保存して、呼び出したPDFをブラウザで、参照する処理を追加しました。
1. Oracle Database Express Edition は、Windows10にインストール(バージョンは21c)、接続の検証は、A5SQL Mk2 で行いました。
A5SQL Mk2 は、たしか Delphi製だったかと思うのですが、直接接続なるものが設定でき、Oracle Instant Clientは不要で接続できますが、今回は、FireDACでの接続なので、oci.dllなどのdllが、必要なので、Oracle Instant Client を使用します。
2. Oracle Database Express Edition データベースは XE を使用(変更不可だったと思います?)
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 にはなく、今回追加した処理で、今回は追加部の説明を記事にします。
以下サンプルコード
PDFデータの追加のサンプルコード
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に保存のサンプルコード
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をクロームで参照するサンプルコード
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つを配置とあります。
tnsnames.oraは、Oracle Database Express Edition をインストールした、Windows10からコピーして、今回は、マシン名をIPアドレスに変更してしようしました。
(Oracleをインストールしたマシンの C:\app\w10o\product\21c\homes\OraDB21Home1\network\admin から)
# 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] を読み込めません。指定されたモジュールが見つかりません。が表示される場合
Microsoft Visual C++のランタイムがインストールされていない場合にでるようなので、Microsoft Visual C++再頒布可能な最新のサポートされているダウンロード
からダウンロードとインストールが必要です。
このDelphiのサンプルソースのダウロードは、ここからできます