第30回 エンバカデロ・デベロッパーキャンプ【E4】Delphi/C++テクニカルセッション

今さら聞けない!? ｢FireDAC⼊⾨｣〜 イン－メモリーデータベース編 〜

2015年5⽉21⽇
⽥中 芳起
http://www.embarcadero.com/jp
1 http://www.embarcadero.com/jp

Ver.1.0.2
Copyright Links, Yoshiki Tanaka

⾃⼰紹介
名前：⽥中 芳起（たなか よしき）
• 中堅SIerでパッケージシステムの開発／プロジェクト管理／
品質管理 等の仕事に従事• 26th デブキャンプで「はじめてのFireDAC」の講師を担当• 29th デブキャンプで「Visual NAVI」の講師を担当• Delphiとは 1.0US版 からの付き合い• ホームページ• ブログ• Facebook: http://www.avsoft.jp/: http://avsoft.typepad.jp/blog/: https://www.facebook.com/yoshiki.tanaka.942/: https://www.facebook.com/VisualNavi: https://www.facebook.com/groups/864814060228437/

2

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

アジェンダ はじめに••••スマートデバイスと「データ連携」するための技術
技術のポジショニング
イン－メモリデータベース
JSONってなにもの?

 FireDACのおさらい
•
•
•
•
•
•
•

3

FireDACとは?
FireDACを使⽤するメリットは･･
FireDACアプリケーションの構造
Delphi XE5での変更点
Delphi XE7 での変更点
BDEとFireDAC 主要コンポーネントの⽐較
データベースクラスの継承関係

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

アジェンダ FDMemTable
•
•
•
•
•
•
•
•
•
•

テーブルを⽣成する
⼀般的な「Xml ファイル」は読込めない！
出⼒した「Xml ファイル」の構造は･･
⾃⼒で｢Xml ファイル｣を 読み／書き してみると･･
拙作クラス (TDataMigration) で読み／書きしてみると･･
別のデータセットから、全てのレコードをコピーする
別のデータセットのデータを共有する
データセットの状態を調べる
取得するデータを絞り込む
TFDMemTable のまとめ

 SQLite
•
•
•
•
•
•
4

接続の設定
テーブルを⽣成する
⾼速にデータを挿⼊する
動的問い合わせデータベースをバックアップする
SQLをトレースする

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

アジェンダ EMSサーバー／クライアント

5

•
•
•
•

Webアプリケーション／DataSnapの構成
EMSサーバー／クライアントの構成
EMS って、なに･･?
REST って、なに･･?

•
•
•
•
•
•
•
•
•

DEMONSTRATION 〜DataSetを渡す〜
デモンストレーションの説明
ウィザードを使ってRESTリソースを作成する
ウィザードが作成した RESTリソース の内容は･･
RESTメソッドの実装（Get／Post）
クライアントからRESTメソッドを呼び出す
コンポーネントの関係とデータの流れ
クライアント側の実装ポイントを整理
EMSサーバーウィンドウ

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

アジェンダ

6

•
•
•
•
•
•
•
•
•

DEMONSTRATION 〜パラメータを渡す〜
デモンストレーションの説明
RESTメソッドの定義
RESTメソッドの実装（Get）
RESTメソッドの実装（Post）
クライアントからRESTメソッド(Get)を呼び出す
クライアントからRESTメソッド(Post)を呼び出す
受け渡すパラメータの設定
コンポーネントの関係とデータの流れ

•
•
•
•
•
•
•
•

EMSサーバーとの「接続」を確認する
ブラウザからEMSサーバーへアクセスする
RESTデバッガを使ってみる
JSONテキストをインターセプトする
XE7とXE8でEMSサーバーを共有させる
XE8の新機能
動作環境／ライセンス について
参考情報／関連情報 (Docwiki)

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

FireDAC⼊⾨
はじめに

http://www.embarcadero.com/jp
7 http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

スマートデバイスと「データ連携」するための技術
 アプリケーション テザリング

アプリケーション間で、あらゆるアクションデータを共有する

Delphi/C++Builderで実装可能

 DataSnap

バックエンドのデータベースをDataSnapでカプセル化する BaaS(Backend as a Service/バース)サービスの活⽤

データストア、プッシュ通信、ユーザー管理、ソーシャル連係、ロケーション連係･･を
モバイルアプリケーションからAPIで呼び出すことが可能

 EMS(Enterprise Mobility Services)

データアクセスモジュールやカスタムAPIをホストできるミドルウェアサーバー機能

オープンかつ業界標準の技術がベース
REST
8

http://www.embarcadero.com/jp

HTTP/S

JSON･･･
Copyright Links, Yoshiki Tanaka

技術のポジショニング
顧客はサーバーサイド開発・運⽤はしない

SaaS *1

BaaS *2(Salesforce.comなど)
業務特化型
ASPサービス*1 SaaS：アプリケーション（ソフトウェア）を提供

サーバーアプリでの処理がメイン

IaaS *3(AWSなど)(GAEなど)*3 IaaS：サーバー、CPU、ストレージ等のインフラの仮想化*4 PaaS ：アプリケーションを稼働するための基盤を提供
http://www.embarcadero.com/jp

クライアントアプリでの処理がメイン

PaaS *4

⾃社サーバー運⽤

9*2 BaaS：スマホアプリの開発・運⽤に必要なサーバー側の機能を提供

低価格レンタルサーバ
顧客はサーバーサイド開発・運⽤はする
Copyright Links, Yoshiki Tanaka

イン－メモリデータベース◆ 定義
データを全て「メインメモリ上に格納する⽅式」で構築されたデータベース（オン－メモリデータベースと同義）◆ どんなアプリでイン－メモリデータベースを使うのか･･
・データを次々に蓄積して、その中からデータを抽出するタイプのアプリケーション
・データを永続的に保持しておくタイプのアプリケーション
・⼤量のデータから任意のデータを探すタイプのアプリケーション

10

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

JSONってなにもの?
•
•
•
•
•
•

11

JavaScript Object Notation の略
XML等と同様、テキストベースのデータフォーマット
XMLと⽐べると簡潔に構造化されたデータを記述することが可能
記述が容易で⼈間が理解しやすいデータフォーマット
XMLには閉じタグが必要。JSONはカッコに対応する閉じカッコ以外は不要
きちんとインデントされていれば可読性も⾼い

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

FireDAC⼊⾨
FireDACのおさらい

http://www.embarcadero.com/jp
http://www.embarcadero.com/jp
12

Copyright Links, Yoshiki Tanaka

FireDACとは?
Delphi XE4 でAnyDACの｢Embacadero版｣として搭載
ユニバーサルデータアクセスが可能な、⼀体化されたコンポーネント群

・Oracle/MS-SQL Server/DB2/MySQL/PostgreSQL/InterBase/Firebird/SQLite/SQL Anywhere/Advantage DB/
Access/Informix/DataSnapなどに⾼速なネイティブアクセスが可能
・対応ドライバは、次のURLを参照
http://docwiki.embarcadero.com/RADStudio/XE8/ja/FireDAC

DelphiおよびC++Builder向け

・RAD Studio/ Delphi/ C++Builder XE4〜XE8
・詳しくは、次のURLを参照

http://www.embarcadero.com/jp/products/rad-studio/firedac-faq

マルチデバイス・Win32, Win64, Mac OS X, iOS, Android

ハイパフォーマンス・BDEと同等、それ以上のデータアクセススピード

共通化されたAPI・マクロ機能を使ってSQLの⽅⾔や微妙な違いを吸収・修正可能なデータマッピング機能によるデータ型の統⼀化
13

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

FireDACを使⽤するメリットは･･
BDEとの互換性が⾼い

・データアクセスアーキテクチャが類似している
・従来のBDE DataSetとの互換性を備えたDataSetクラスがある
・CachedUpdatesモードも利⽤可能

ハイパフォーマンス・BDEと同等、それ以上のデータアクセススピード

配布が簡単

・専⽤のデータベースドライバやインストーラが不要

14

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

FireDACアプリケーションの構造
・FireDACアプリケーションは、3層構造・⾚枠がFireDACコンポーネント本体
・開発には32ビットのクライアントライブラリが必須

15

http://www.embarcadero.com/jp

注意！

Copyright Links, Yoshiki Tanaka

Delphi XE5 での変更点
 コンポーネント名が｢TADxxx｣から｢TFDxxx｣へ変更

・｢reFind｣という名称変更ツールが提供されている。
・フォームファイル(*.dfm)のAdpterが｢ Fdpter ｣と誤変換されるので注意が必要

 InterBaseとFirebirdのDriverIDが次の通り変更（XE4では両⽅｢IB｣だった･･）・InterBase → IB
・Firebird → FB

 usesのユニット名が次の通り変更

・uAD<レイヤ><ロール>.pas → FireDAC.<レイヤ>.<ロール>.pas
ex. uADCompClient が｢FireDAC.Comp.Client｣に変更

 次の3つのプログラムは、IDEのメニューから直接呼び出せない *1
・FireDAC エクスプローラ (FDExplorer.exe)
・FireDAC モニタ (FDMonitor.exe)
・REST デバッガ (RESTDebugger.exe) 詳細はFireDACヘルプ(DocWiki)を参照 *2*1 エンバカデロの⼿違いでXE5では、メニューに登録されていません。プログラムの単独起動となる
詳しくは、こちらをご覧下さい。(http://blog.marcocantu.com/blog/new_tools_xe5_missing_menu.html)*2 ｢FireDACへの移⾏｣を参照(http://docwiki.embarcadero.com/RADStudio/XE8/ja/FireDAC_%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C)

16

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

Delphi XE7 での変更点
 クラス名、ユニット名等のリファクタリング
旧バージョンのプロジェクトを移⾏する場合は注意が必要
 JSON シリアル化をサポート
Bin/XML/JSONの形式ごとにTFDStanStorageXXXLink*1 を追加
 データエクスプローラで FireDAC が利⽤可能
 TFDBatchMove の追加（TFDDataMove は⾮推奨）
 MSSQL FILESTREAMのサポート
 DBMSネイティブコマンドタイムアウト(ODBC API)のサポート
利⽤可能なDB: Advantage/Informix/SQL Server*1 TFDStanStorageBinLink: バイナリ形式／ TFDStanStorageXMLLink: XML形式／ TFDStanStorageJSONLink: JSON形式

17

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

BDEとFireDAC 主要コンポーネントの⽐較
BDE

FireDAC

Unit

TDatabase

TFDConnection

FireDAC.Comp.Client

TSession

TFDManager

FireDAC.Comp.Client

TTableTFDTable

FireDAC.Comp.Client

TQueryTFDQuery

FireDAC.Comp.Client

TStoredProc

TFDStoredProc

FireDAC.Comp.Client

TUpdateSQLTFDUpdateSQLFireDAC.Comp.Client

TBatchMove

TFDDataMove

FireDAC.Comp.DataMove－

TFDPhysXXXXDriverLink

FireDAC.Phys.XXXX－TFDGUIxWaitCursor

FireDAC.Comp.UI※ BDEのコンポーネント名にFireDACの「FD」を付加したネーミング※ XXXX：ドライバーによって異なる
18

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

データベースクラスの継承関係
TComponent
TCustomConnection
TDataSet

TFDDataSet

TFDRdbmsDataSet

TFDCustomConnection

TFDConnection

TFDAdaptedDataSet
TFDCustomMemTab

TFDMemTable

TFDCustomQueryTFDQuery
TFDTable

TFDComponent

TFieldTDataSource19

http://www.embarcadero.com/jp

TFDCustomStoredProc

TFDStoredProc

TFDCustomManager

TFDManager

TFDCustomUpdateObject

TFDUpdateSQLTFDDataMove

XXX：FireDACXXX：Delphi標準

XXX：TDataSetから派⽣

Copyright Links, Yoshiki Tanaka

FireDAC⼊⾨
FDMemTable

http://www.embarcadero.com/jp
http://www.embarcadero.com/jp
20

Copyright Links, Yoshiki Tanaka

テーブルを⽣成する
privateCustomersTbl: TFDMemTable;
CustomersTbl := DataModule1.NewCustomers;function TDataModule1.NewCustomers: TFDMemTable;[次の様に書き換えることもできる]
begin
FieldDefs.Add('CUSTOMERID', ftInteger);
Result := TFDMemTable.Create(nil);FieldDefs.Add('COMPANYNAME', ftString, 40);
with Result do
FieldDefs.Add('ADDRESS', ftString, 120);
begin
FieldDefs.Add('PHONE', ftString, 15);// 項⽬定義*1*2
FieldDefs.Add('FAX', ftString, 15);
FieldDefs.Add('CUSTOMERID', ftInteger, 0, False);
FieldDefs.Add('COMPANYNAME', ftString, 40, False);
FieldDefs.Add('ADDRESS', ftString, 120, False);
FieldDefs.Add('PHONE', ftString, 15, False);
FieldDefs.Add(‘FAX’, ftString, 15, False);// インデックス定義
IndexDefs.Add('Customers_IDX','CUSTOMERID', [ixPrimary]);// 空の内部データ記憶域を作成
CreateDataSet;// ログ記録をOff
LogChanges := False;
end;
end;

*1 Sizeプロパティは，ftString/ftBCD/ftBytes/ftVarBytes/ftBlob/ftMemo/ftGraphic のときのみ有効*2 RequiredプロパティがFalseならNullを許可する（省略可能）
21

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

⼀般的な「Xml ファイル」は読込めない！
procedure TDataModule1.SaveToTable(AFileName: String);
begin
FDMemTable1.LoadFromFile(AFileName, sfXML);
end;

LoadFromFile

22

http://www.embarcadero.com/jp

TFDMemTable

Copyright Links, Yoshiki Tanaka

出⼒した「Xml ファイル」の構造は･･
procedure TDataModule1.SaveToTable(AFileName: String);
begin
FDMemTable1.SaveToFile(AFileName, sfXML);end;

TFDMemTable

SaveToFile
列情報23

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

⾃⼒で｢Xml ファイル｣を 読み／書き してみると･･

Load/Save

Load

TFDMemTable

Save
CSV

XML

CSV

XML

1,200,000

90,00080,0001,000,000

70,00060,000800,000

50,000600,000

40,00030,000400,000

20,000200,000

10,000
0
1,000

5,000

10,00050,000100,000

0
1,000

5,000

10,00050,000100,000※ ⽇本郵便の「郵便番号データ」を使⽤し、5回の実測値の平均をグラフ化※ グラフの横軸は件数／グラフの縦軸は処理時間（単位：ミリ秒(ms) )24

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka拙作クラス (TDataMigration) で読み／書きしてみると･･
CSV

CSV

XML

XML
TFDMemTable

JSON

JSON

テーブル定義テーブル定義

Load

Save
CSV

XML

JSON

CSV

700

700

600

600

500

500

400

400

300

300

200

200

100

100

XML

JSON

0

0
1,000

5,000

10,00050,000100,000

1,000

5,000

10,00050,000100,000※ ⽇本郵便の「郵便番号データ」を使⽤し、5回の実測値の平均をグラフ化※ グラフの横軸は件数／グラフの縦軸は処理時間（単位：ミリ秒(ms) )25

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

別のデータセットから、全てのレコードをコピーする
Dataプロパティを使⽤
procedure TDataModule1.CopyRecord;
begin
FDQuery1.FetchOptions.Unidirectional:= False;
FDQuery1.Open;
FDQuery1.FetchAll;
FDMemTable1.Data := FDQuery1.Data;
FDMemTable1.First;
end;

CopyDataSetメソッドを使⽤
procedure TDataModule1.CopyTable;
begin
FDMemTable1.CopyDataSet(FDQuery1, [coStructure, coRestart, coAppend]);
end;

26

⽐較項⽬

Dataプロパティ

CopyDataSetメソッド

FireDAC以外のデータセット

×

〇

使⽤クラス

DatS(ローカルデータストレージ)

TDataSet

コピー対象

レコードすべてのバージョン(履歴含む)

現在のフィールド値

速度

⾼速

低速

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

別のデータセットのデータを共有する
CloneCursorメソッドを使ってクローンカーソルを作成する。
2つのデータセットの内部データ記憶域は、物理的に同⼀となる。
procedure TDataModule1.CopyTable;
begin
FDMemTable1.CloneCursor(FDQuery1, False, False);
end;

同⼀
TFDMemTable27

http://www.embarcadero.com/jp

TFDQuery

Copyright Links, Yoshiki Tanaka

データセットの状態を調べる
TFDMemTableの「Stateプロパティ」を調べるとデータセットの状態を知ることができる
Stateプロパティ

状

態

説

明

dsInactive

⾮アクティブ状態

データセットが開かれていない

dsBrowse

参照状態

データセットは参照モードにある

dsEdit

編集状態

データセットは修正モードにあるdsInsert

挿⼊状態

データセットは挿⼊モードにあるStateプロパティの変化
dsInactive
メソッドの呼出OpendsEdit28

http://www.embarcadero.com/jp

Edit
Post/Cancel

Close

dsBrowse

Append/Insert
Post/Cancel

dsInsert

Copyright Links, Yoshiki Tanaka

取得するデータを絞り込む
TFDMemTableの「Filterプロパティ」･「Filteredプロパティ」を使ってデータを絞り込むことができる
演算⼦

Filterプロパティの設定例

⽐較演算⼦

Address1 = '⻑野県'

論理演算⼦

Address1 = '⻑野県' OR Address1='新潟県'

LIKE演算⼦

Address1 LIKE '⻑%'

IN演算⼦

OrderID IN (10150, 10151, 10152)

NULL判定Address1 is NULL

procedure TForm1.btnSearchClick(Sender: TObject);
beginwith FDMemTable1 do
begin
Filtered := False;// フィルタのセット
Filter:= 'Address1=' + QuotedStr('⻑野県');
Filtered := True;
end;
end;
29

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

TFDMemTable のまとめ
イン－メモリー、またはデータベースを切断しての使⽤に使われる。
主な機能
 別のデータセットからコピー
Dataプロパティ、CopyDataSetメソッドを使⽤
 ファイルとストリームによるデータの永続性
ファイルの形式は XML(sfXML)、バイナリ(sfBinary)、JSON(sfJSON)
メソッドは LoadFromFile、SaveToFile、SaveToStream、LoadFromStream キャッシュアップデート クローン化されたカーソル
CloneCursorメソッド
 ネストされたデータセット

30

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

FireDAC⼊⾨
SQLitehttp://www.embarcadero.com/jp
http://www.embarcadero.com/jp
31

Copyright Links, Yoshiki Tanaka

接続の設定FireDAC 接続エディタで設定
オブジェクトインスペクタの下にある ｢接続エディタ ...｣ をクリックする ドライバ ID:
リストから接続するサーバーのIDを指定選択すると既定値が、パラメータ欄に表⽰される
 接続定義名:（必須ではない）
エリアス名をリストから選択
エリアスは ｢FireDAC エクスプローラ｣ で設定
 Database:
イン－メモリーデータベースを使⽤するので｢:memory:｣を指定
ここがポイント！

※他のパラメータは、適宜設定します※⼊⼒後、｢テスト｣ボタンを押して接続を確認
32

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

接続の設定（続き）
コードで設定実⾏時に接続に必要なパラメータをコードで指定する
trywith FDConnection1 do
begin// 接続パラメータのセット
Params.Clear;
Params.Add('DriverID=SQLite');Params.Add('Database=:memory:');LoginPrompt := False;
// 接続
Open;
end;
exceptMessageDlg(‘データベースに接続できません！', mtError, [mbOK], 0);
end;※イン－メモリーデータベースの場合、Databaseパラメータに｢:memory:｣を指定する。
従来型の「オンディスクデータベース」の場合は、データベースのフォルダを指定する。

33

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

テーブルを⽣成する
SQL⽂を発⾏するメソッドには２種類ある

結果セットを返す場合と、返さない場合とでは使⽤するメソッドが異なる
メソッド

機

能

Open

SELECT⽂を使ってデータセットに問い合わせを⾏い、その結果を受け取る

ExecSQL

DDL/DML⽂などのデータセットに対して操作を⾏い、その結果を返さないSQL⽂を実⾏する

const
strSQL = 'CREATE TABLE personal(id integer, name text(20))';try
with FDQuery1 do
begin// SQL⽂をセット
SQL.Clear;
SQL.Add(strSQL);// SQLの実⾏
ExecSQL;
end;
exceptMessageDlg('テーブルを作成できません！', mtError, [mbOK], 0);
end;34

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

⾼速にデータを挿⼊する
・FireDACの「DML配列機能」を使う
・複数のDML(INSERT/UPDATE/DELETE)⽂をパラメータ付きで⼀度に実⾏できる
・⾼速実⾏の実現
通常のExecSQL → 5.5秒
DML配列 → 0.03秒

const
strSQL = 'INSERT INTO personal (id, name) VALUES(:f1, :f2)';vari: Integer;
with FDQuery1 do
begin// SQL⽂のセット
SQL.Clear;
SQL.Add(strSQL);// 配列の⼤きさをセット
Params.ArraySize := 1000;// 配列に値をセット
for i:=0 to Params.ArraySize do
begin
ParamByName('f1').Values[i-1] := i;ParamByName('f2').Values[i-1] := 'Str' + IntToStr(i);end;// SQLの実⾏
Execute(FDQuery1.Params.ArraySize, 0);
end;

35

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka動的問い合わせ
実⾏時にパラメータを指定してSQLを実⾏する

SQL⽂にSQLパラメータ*1 を埋め込むことで、変数のように利⽤できる
プロパティ／メソッド機

能Params[n]変数配列n番⽬に対して値をセットする

ParamByName(Value)

引数Valueに指定された変数名に対して値をセットする

procedure TForm2.btnExeSelectClick(Sender: TObject);
const
strSQL = 'SELECT * FROM personal WHERE (id >= :startcode) AND (id <= :endcode)';begin
with FDQuery1 do
begin// SQL⽂のセット
SQL.Clear;
SQL.Add(strSQL);// 変数に値をセットする[次の様に書き換えることもできる]
ParamByName('startcode').AsInteger := 501;
Params[0].AsInteger := 501;
ParamByName('endcode').AsInteger:= 1000;
Params[1].AsInteger := 1000;// リソースの割り当てと最適化を実⾏する
Prepare;// SQLの実⾏
Open;
end;
end;

*1 SQLパラメータ：バインド変数・ホスト変数とも呼ばれる。パラメータ名の前にコロン(:)を付けて記述します

36

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

データベースをバックアップする
SQLiteのバックアップは、次の2つのコンポーネントを使って⾏う。
• TFDPhysSQLiteDriverLink *1• TFDSQLiteBackup
procedure TForm1.btnBackupClick(Sender: TObject);begin// sqlite3.dllのパスを指定
FDPhysSQLiteDriverLink1.VendorLib := ‘C:¥pg¥sqlite¥sqlite3.dll';
FDSQLiteBackup1.DriverLink := FDPhysSQLiteDriverLink1;// データベースの指定
FDSQLiteBackup1.DatabaseObj := FDConnection1.CliObj;// ファイル名の指定
FDSQLiteBackup1.DestDatabase := ‘C:¥Temp¥SQLite.backup';// バックアップ処理の実⾏
FDSQLiteBackup1.Backup;
end;*1 TFDPhysSQLiteDriverLink は、イン－メモリーデータベースのみの時は不要です。

37

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

SQLをトレースする・プロジェクトにデータモジュールを追加し、コンポーネントを配置
・TFDMoniRemoteClientLinkコンポーネント(⾚枠)を配置

TFDMoniRemoteClientLinkコンポーネントのプロパティを設定
TFDMoniRemoteClientLink

設定内容

HOST *1｢FireDAC Monitor｣が起動しているTCP/IPのアドレスを指定
Defaultは127.0.0.1(localhost)Port｢FireDAC Monitor｣でリスニングしているポートを指定
標準ポートは8050*1 別PCでモニタリングする場合は、そのIPアドレスを指定する
38

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

SQLをトレースする（続き）
FireDAC 接続エディタで設定
オブジェクトインスペクタの下にある ｢接続エディタ ...｣ をクリックする
ここがポイント！

 MonitorBy
リストから｢Remote｣を選択

39

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

SQLをトレースする（続き）
 Tracingプロパティを設定します
FDMoniRemoteClientLink1.Tracing := True;*1
 FireDACモニタ を起動する*1 True: トレース開始／False: トレース終了

40

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

SQLをトレースする（続き）
アプリケーションからSQLを実⾏し、モニタで結果を確認する

41

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

FireDAC⼊⾨
EMSサーバー／クライアント

http://www.embarcadero.com/jp
http://www.embarcadero.com/jp
42

Copyright Links, Yoshiki Tanaka

Webアプリケーション／DataSnapの構成
 ⼀般的なWebアプリケーション
ClientCloud
Web Server

HTTP/S

Data Server
TCP/IPRDBMS
TCP/IP DataSnap(REST) アプリケーション
ClientCloud
Data Server

HTTP/S
DataSnap

TCP/IPRDBMS
TCP/IP

TCP/IP43

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

EMSサーバー／クライアントの構成
EMS Server
Package

ClientRESTリソース
HTTP/S
DB

REST
API

：
RESTリソースEMS DBBaaS Providers

EMS Console
HTTP

44

http://www.embarcadero.com/jp･Users tracking･REST API analytics

Copyright Links, Yoshiki Tanaka

EMS って、なに･･?
 Enterprise Mobility Services の略
 データアクセス、カスタムAPIを搭載したミドルウェアサーバー
 ユーザー管理／認証機能を搭載
 REST上にロード可能なカスタムAPIを実装可能
 EMSを介して、企業のSQLデータベースへアクセス可能 モバイル組込やサーバー側のSQLデータ·ストレージ ユーザー、デバイス、およびAPIの分析可能なWebコンソール搭載

45

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

REST って、なに･･?
 REpresentational State Transfer の略
 HTTP／HTTPS を使ったシンプルな Webサービス
 URI でリソースを特定する
例えば (http://example.com/users/1234) という感じ
 HTTPメソッド を使⽤して操作する
GET/POST/PUT/DELETE･･
メソッド

役

割

GET

リソースの取得。GETでのアクセスはリソースの内容に影響を与えない

POST

リソースの新規作成

PUT

既存のリソースのアップデート（変更／更新）

DELETE

リソースの除去／削除

 JSON／XML 等のデータを利⽤する
 多くのベンダーから開発者向けAPIがRESTで提供されている
Google/Amazon/Salesforce/JIRA･･
46

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

DataSetを渡す

DEMONSTRATION
47

http://www.embarcadero.com/jp

デモンストレーションの説明
ClientEMS Server

REST
API

RESTリソースEMPLOYEE.GDB
Department
Employee

EMS DB

InterBaseEMS Console･Users tracking･REST API analytics

48

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

ウィザードを使ってRESTリソースを作成する

49

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

ウィザードが作成した RESTリソース の内容は･･
RESTリソースの中⾝は「パッケージ」です。
unit Unit1;// EMS Resource Moduleinterface
uses
System.SysUtils, System.Classes, System.JSON,
EMS.Services, EMS.ResourceAPI, EMS.ResourceTypes;
type[ResourceName('EMS Test')]
リソース名
TFireDACEMSTestResource1 = class(TDataModule) *1
publishedprocedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);
procedure Post(const AContext: TEndpointContext; const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);
end;
procedure Register;
implementation

メソッド(GET/POST){%CLASSGROUP 'System.Classes.TPersistent'}{$R *.dfm}*1 RESTリソースは、TDataModule を継承している50

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

ウィザードが作成した RESTリソース の内容は･･ （続き）
空のメソッドが作成される
procedure TFireDACEMSTestResource1.Get(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
begin
end;
procedure TFireDACEMSTestResource1.Post(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
begin
end;
procedure Register;
begin
RegisterResource(TypeInfo(TFireDACEMSTestResource1));
end;
end.

51

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

RESTメソッドの実装（Get／Post）
procedure TEMSTestResource1.Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);var
oStr: TMemoryStream;
begin
oStr := TMemoryStream.Create;
try
FDQueryDepartment.Open;
FDQueryEmployees.Open;FDSchemaAdapter1.SaveToStream(oStr, TFDStorageFormat.sfJSON);
AResponse.Body.SetStream(oStr, ‘application/json', True);
exceptoStr.Free;
end;
end;

procedure TEMSTestResource1.Post(const AContext: TEndpointContext; const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);var
LStream: TStream;
begin
if not SameText(ARequest.Body.ContentType, ‘application/json') thenAResponse.RaiseBadRequest('content type');
if not ARequest.Body.TryGetStream(LStream) thenAResponse.RaiseBadRequest('no stream');LStream.Position := 0;
FDSchemaAdapter1.LoadFromStream(LStream, TFDStorageFormat.sfJSON);FDSchemaAdapter1.ApplyUpdates
end;

52

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

クライアントからRESTメソッドを呼び出す

 データの取得（RESTリソースのGetメソッドが呼び出される）
procedure TForm1.btnGetTablesClick(Sender: TObject);begin
dm.EMSFireDACClient1.GetData;
end; データの更新（ RESTリソースのPostメソッドが呼び出される）
procedure TForm1.btnApplyUpdatesClick(Sender: TObject);begin
dm.EMSFireDACClient1.PostUpdates;end;
53

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

コンポーネントの関係とデータの流れ
クライアントRESTリソース

TDataSource
DataSetTFDMemTable

VCL

Adapter
TFDTableAdapter

TEMSProvider

TFDStanStorageJSONLink

TEMSFireDACClient
SchemaAdapter

Department

DB

TFDQueryGet

SchemaAdapter

TFDSchemaAdapter

TFDSchemaAdapter

TFDTableAdapter

SchemaAdapter

Adapter

TFDQuery

TFDMemTable
DataSetTDataSource54

http://www.embarcadero.com/jp

DB

Employee

プロパティ設定
データの流れCopyright Links, Yoshiki Tanaka

クライアント側の実装ポイントを整理
コンポーネント

55

設定ポイントTEMSProvider

接続するEMSサーバーのURL／ポートを指定する
指定するプロパティは URLHost／URLPortTEMSFireDACClient

REST APIでコールされるRESTリソース名を指定する
指定するプロパティは Resource

TFDSchemaAdapter

データセットを⼀元的に管理する
⼀元キャッシュ更新をサポート

TFDTableAdapter

RESTリソースのデータセットを指定する
指定するプロパティは DatSTableName
TFDSchemaAdapterと接続される (SchemaAdapter)※データセット単位に必要

TFDMemTable

テーブルの更新情報をサーバー側に反映するために
CachedUpdatesプロパティを「True」に設定する
TFDTableAdapterと接続される (Adapter)

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

EMSサーバーウィンドウサーバーを起動すると「EMSサーバーウィンドウ」が⾃動的に起動する

項

⽬

説

明

起動

EMSサーバーを起動

停⽌

EMSサーバーを停⽌

ブラウザを開く

デフォルト・ブラウザを開く

コンソールを開く[EMS コンソール]サーバー ウィンドウを開く

ポート

EMSサーバーにアクセスするためのポート番号を⼊⼒

ログ

EMSサーバーメッセージを表⽰(リソース／サーバーへ要求)

ログ記録を有効にする

チェックするとログを記録

クリア

ログ表⽰をすべて削除

詳細は こちら を参照

56

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

パラメータを渡す

DEMONSTRATION
57

http://www.embarcadero.com/jp

デモンストレーションの説明
ClientEMS Server

REST
API

RESTリソースEMPLOYEE.GDB
Department
Employee

EMS DB

InterBaseEMS Console･Users tracking･REST API analytics

58

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

RESTメソッドの定義
published[ResourceSuffix('AllDepartments')]
procedure GetAllDepartments(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);[ResourceSuffix('Employees')]
procedure GetEmployees(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);[ResourceSuffix('Employees')]
procedure PostEmployees(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);end;

クライアント側の設定

・TEMSFireDACClient の Resource に ResourceSuffix で定義した⽂字列をセットする。
59

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

RESTメソッドの定義（続き）
published：[ResourceSuffix('Employees')]
procedure GetEmployees(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);：end;

クライアント側の設定

・TBackendEndpoint の ResourceSuffix に ResourceSuffix で定義した⽂字列をセットする。
60

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

RESTメソッドの実装（Get）
procedure TEMSFireDACTestResource.GetAllDepartments(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);var
ms: TMemoryStream;
begin
ms := TMemoryStream.Create;
try
FDQueryDepartment.SQL.Text := 'select * from department';
FDQueryDepartment.Open;FDSchemaAdapter1.SaveToStream(ms, TFDStorageFormat.sfJSON);
AResponse.Body.SetStream(ms, 'application/json', True);
exceptms.Free;end;
end;・Getメソッド(GetAllDepartments)が呼ばれると、表(Department)のすべてのレコードがクライアントにJSON形式で戻される。

61

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

RESTメソッドの実装（Get）（続き）
procedure TEMSFireDACTestResource.GetEmployees(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);var
ms: TMemoryStream;
vDeptNo: String;begin
ms := TMemoryStream.Create;try
vDeptNo := ARequest.Params.Values['DeptNo'];
if vDeptNo <> '' thenbegin
FDQueryDepartmentEmployees.Close;
FDQueryDepartmentEmployees.SQL.Text :='select * from employee where dept_no = :DEPT';
FDQueryDepartmentEmployees.ParamByName('DEPT').AsString := vDeptNo;
FDQueryDepartmentEmployees.Prepare;
FDQueryDepartmentEmployees.Open;FDSchemaAdapter2.SaveToStream(ms, TFDStorageFormat.sfJSON);
AResponse.Body.SetStream(ms, 'application/json', True);end;
exceptms.Free;end;
end;・Getメソッド(GetEmployees)が呼ばれると、表(Employee)から部⾨コードが等しいデータを抽出し、クライアントにレスポンス(JSON形式)で返す。
62

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

RESTメソッドの実装（Post）
procedure TEMSFireDACTestResource.PostEmployees(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);vars: TStream;
begin
if not ARequest.Body.TryGetStream(s) then AResponse.RaiseBadRequest('no stream');s.Position := 0;
FDSchemaAdapter2.LoadFromStream(s, TFDStorageFormat.sfJSON);FDSchemaAdapter2.ApplyUpdates;end;・クライアントから送られた変更データ(JSON形式)で表(Employee)を更新する。

63

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

クライアントからRESTメソッド(Get)を呼び出す

procedure TForm1.btnGetTablesClick(Sender: TObject);begin
EMSFireDACClient1.GetData;
end;
・TEMSFireDACClient の GetData メソッドでサーバ側のRESTメソッド(GetAllDepartments)を呼び出す。
64

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

クライアントからRESTメソッド(Get)を呼び出す（続き）
procedure TDataModule1.FDMemTable1AfterScroll(DataSet: TDataSet);var
ts: TStringStream;
vDeptNo: String;begin// 部⾨コードの取得
vDeptNo := FDMemTable1.FieldByName('DEPT_NO').AsString;// サーバーへ部⾨コードを送出
Form1.BackendEndpoint1.Params.Items[0].Value := vDeptNo;
Form1.BackendEndpoint1.Execute;// サーバーから送られたJsonを取り込む
ts := TStringStream.Create(Form1.BackendEndpoint1.Response.JSONText);try// FDMemTable2にDataSetをセットする
FDMemTable2.LoadFromStream(ts, sfJson);
finallyts.Free;end;
end;・カーソル位置の部⾨コードを取得し、TBackendEndpoint の Params にセットする。
・TBackendEndpoint の Execute メソッドでサーバ側のRESTメソッド(GetEmployees)を呼び出す。
・サーバーからのレスポンス(JSON形式)をFDMemTableにセットする。

65

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

クライアントからRESTメソッド(Post)を呼び出す

procedure TForm1.btnApplyUpdatesClick(Sender: TObject);begin
EMSFireDACClient2.PostUpdates;
end;
・TEMSFireDACClient の PostUpdate メソッドでサーバ側のRESTメソッド(PostEmployees)を呼び出す。
66

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

受け渡すパラメータの設定

67

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

コンポーネントの関係とデータの流れ
クライアントTDataSource

TEMSProvider
TFDStanStorageJSONLink

DataSetTFDMemTable

VCL

Adapter

RESTリソースTEMSFireDACClient
SchemaAdapter

Department

DB

TFDQueryGet

SchemaAdapter

TFDTableAdapter

TFDSchemaAdapter

TFDSchemaAdapter

TFDTableAdapter

TFDSchemaAdapter

TFDSchemaAdapter

Adapter
TFDMemTable

SchemaAdapter

Get

SchemaAdapter
TFDQueryTEMSFireDACClient

DataSetTDataSource68

http://www.embarcadero.com/jp

プロパティ設定
データの流れDB

Employee

Copyright Links, Yoshiki Tanaka

EMSサーバーを構築する• はじめてEMSサーバーを起動すると、構築設定の画⾯が表⽰される。

69

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

EMSサーバーとの「接続」を確認する• TEMSProviderで右クリックし、メニューから［接続テスト］をクリック• 接続が正しければEMSサーバーの現在のバージョンが表⽰される

70

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

ブラウザからEMSサーバーへアクセスする
EMSサーバーには、通常のWebブラウザを使ってアクセスできる
http://<IP アドレス>:<ポート番号>/<RESTリソース名>

http://localhost:8080/EMS Test/取得したJSONの内容

運⽤環境の場合：
http://<IP アドレス>/<サイト名>/emsserver.dll
71

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

RESTデバッガを使ってみる
http://localhost:8080

EMS Test

72

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

JSONテキストをインターセプトする
JSON Viewer を使ってJSONテキストを表⽰する*1 JSON Viewerは、次のサイトからダウンロードできます。
https://jsonviewer.codeplex.com/

73

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

XE7とXE8でEMSサーバーを共有させる
 XE8で「EMS DB」の構造が変更されている。
 XE8インストール時、 XE7 の｢EMS DB｣ があれば、｢EMSSERVER1.IB｣となる。
 EMSの初期設定ファイル｢emsserver.ini ｣が、上記DBに書き換わる。
 ｢Data｣セクションの｢Database｣パラメータをコメントアウトする。
 新たに｢Database｣パラメータを追加する。（⾚枠の部分）[Data];# Interbase connection parameters;Database=C:¥Users¥Public¥Documents¥Embarcadero¥EMS¥emsserver1.ib
Database=C:¥Users¥Public¥Documents¥Embarcadero¥EMS¥emsserver.ib
UserName=sysdba
Password=masterkey
SEPassword=
InstanceName=;# SEPassword connects to an encrypted database[Server.Keys]：

 環境に応じて次のようにEMSサーバーの指定を切り替える
XE8 → emsserver1.ib
XE7 → emsserver.ib
74

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

XE8の新機能

D: Delphi / C:C++Builder
C2 D2: Professionalでは、FireDAC Client/Server Pack が必要

75

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

動作環境／ライセンス について
動作環境

運⽤環境は、EMSサーバー/コンソールサーバー共に、Webサーバーにセットアップされることが推奨されている。（詳細はこちら）

対応しているWebサーバーは、IIS(Microsoft社)のみ。

しかし、ロードマップを⾒るとLinuxへの対応が明⾔されているので、将来はWindows/IIS
以外の環境・Webサーバソフトで稼働できることも推測される。（ロードマップはこちら）

ライセンスについて

次のエディションのRAD Studioが必要
・Enterprise 版以上
・Professional 版の場合は、別途 FireDAC Client/Server Add-On Pack（有償）が必要
・Appmethod Windows

配布ライセンス

EMSの配布については、サービス機能を使⽤するユーザー数に応じてライセンスの購⼊が必要※ 価格等詳細については、エンバカデロ宛てお問合せ下さい。

76

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka参考情報 Developer Skill Sprints

http://www.embarcadero.com/jp/landing-pages/skill-sprints

 DataSnapユースケース研究- 多層技術の概要と最適化、実践テクニック http://edn.embarcadero.com/jp/article/images/43547/b4.pdf

 多層分散型基幹業務システム構築の課題と解決
http://edn.embarcadero.com/jp/article/images/43816/c5.pdf

 Mobilizing your Business with Enterprise Mobility Services Middleware
http://img.en25.com/Web/Embarcadero/%7Bfc7a9f78-251e-4540-9c6c7172feca344e%7D_Mobilizing_Your_Business_with_EMS_Middleware.pdf

 はじめてのFireDAC

http://edn.embarcadero.com/jp/article/images/43368/a2.pdf

77

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

関連情報 (Docwiki)
 エンタープライズ モビリティ サービス（EMS）
 EMS サーバー EMS コンソール サーバー EMS パッケージのインストール
 DataSnap の概要とアーキテクチャ

78

http://www.embarcadero.com/jp

Copyright Links, Yoshiki Tanaka

ご清聴ありがとうございました

Yoshiki.tanaka-avsoft@nifty.com

79

http://www.embarcadero.com/jp