サイトアイコン Embarcadero RAD Studio, Delphi, & C++Builder Blogs

基礎から学べるFireDACデータアクセス再入門(第4回)

データモジュールにデータアクセス機能をまとめる

本ブログでは、Delphi / C++Builderをある程度使用したことのある方をを対象として、FireDACの基本的な利用方法を解説していきます。

第4回のテーマ

  • リソースのたこ足配線?
  • データモジュールとは
  • データモジュールを利用したアプリケーション作成の演習

前回前々回とFireDACを使用したアプリケーションを作成する演習を行なってきましたが、そのどちらの演習も、フォーム上に直接TFDConnectionやTFDQueryなどのFireDACコンポーネントを配置していました。

サンプルプログラムではよく目にする方法ですが、実際のアプリケーションでは、データアクセスを一元管理したいものです。そうした観点からすると、前回の演習は実用的ではなく、むしろ悪い例でした。

そこで今回の記事では、データベースへアクセスするためのリソースを、より効率的に管理するための方法を紹介します。おそらく、実際のアプリケーションでは、ここで解説する方法が推奨される実装方式になるでしょう。

リソースのたこ足配線?

なぜ、フォーム上にFireDACコンポーネントを配置することが良くないのでしょうか。

ブログをご覧の皆さんの中には、FireDACではなくても、別のDBコンポーネントで似たような経験をお持ちの方もいらっしゃるのではないでしょうか。ここでは、FireDACコンポーネントを例にして説明していきますが、これは別のDBコンポーネントにも該当する一般的な注意点です。

TFDConnectionは、データベースへアクセスするためのリソースに相当し、ActiveプロパティをTrue、もしくはOpenメソッドを実行すると、対象のデータベースとの間にセッションを確立します。それと同時にデータベースの接続数を1つ消費することになります。 このセッションは、Activeプロパティ=False、もしくはCloseメソッドを実行しないと、 閉じないため、(データベースから強制切断をされない限り)そのまま維持します。

もしフォームごとにTFDConnectionを1つ配置していると、一体どのようなことになるでしょうか。

例えば、仮に20個のフォーム画面を作成し、その画面全てがデータベースからデータを取得し、画面にデータを表示する必要があると仮定します。

この場合、画面を表示すると、TFDConnectionの接続をオープンしてセッションを張りますので、もしTFDConnectionの接続を閉じずに、別の画面へ遷移するとデータベースの接続数は最大で20まで増えてしまいます。このような画面の設計スタイルを行っていると、フォーム数に比例して、消費するデータベースのリソースも無駄に増えることになります。

TFDConnection以外のコンポーネントでも同じ事が言えます。

例えば、TFDQueryなどのデータセットは、オープンすると取得したデータ数に応じてメモリ量を消費します。もし不要なデータセットが適切に閉じられていないと、データベースサーバーやクライアントPCのリソースも無駄に消費することになります。

このように画面ごとにFireDACコンポーネントを配置すると、不要なリソースを消費し、個々の管理も乱雑になります。つまり、フォームごとにFireDACコンポーネントを配置するというのは、リソースを「たこ足配線」しているようなイメージになります。

リソースをたこ足配線することによって、リソースを無駄に使用するリスクがあり、 状況によっては、データベースに予め設定されている最大接続数を超えてしまうことも考えられます。

次節では、リソースを効率的に管理するための解決方法について解説いたします。

データモジュールとは

では、どのようにすれば、もっと効率よくリソースを管理できるのでしょうか。

そのためには、FireDACコンポーネントを直接フォーム上へ配置するのではなく、代わりに「データモジュール」を利用します。データモジュールは、画面が表示されない(非表示)特別なフォームで、通常のフォームと同じように、IDEのデザイナ画面からFireDACコンポーネントが配置できます。

データモジュールの主な目的は、GUI(画面)とビジネスルールを分離することです。 今回の悪いアプリケーションを例で言えば、画面ごとに点在していたFireDACコンポーネントを1つのデータモジュールに集約し、各フォーム間で、このデータモジュールを共有します。

データモジュールを利用することで

などのメリットがあり、リソースを効率良く管理することができます。

データモジュールを利用すると、今まで「たこ足配線」だったリソースがスッキリします。

それでは、実際にデータモジュールを利用したアプリケーション作成の演習を行ってみましょう。

データモジュールを利用したアプリケーション作成の演習

このセクションでは、データモジュールを利用したアプリケーション作成の演習を行います。但し、最初からプロジェクトを作成するのではなく、以前作成したFireDACアプリケーションを書き換えて、データモジュールを利用するプロジェクトに変更します。

演習手順は以下の通りです。

  1. 前回作成したFireDACアプリケーションのプロジェクトを開く
  2. プロジェクトにデータモジュールを追加
  3. フォームに配置されていたFireDACコンポーネントをデータモジュールへ移動
  4. 既存のプログラムコードを書き換える
  5. アプリケーションを実行する

(1)既存のプロジェクトを開く

Delphi / C++Builderのメニューから[ファイル]-[プロジェクトを開く]を選択し、前回の演習の手順(12)で保存したプロジェクトを開きます。

(2)データモジュールの追加

Delphiの場合は、メニューの[ファイル]-[新規作成]-[その他]から[Delphiプロジェクト]-[データベース]の”データモジュール”を選択してください。

C++Builderの場合は、メニューの[ファイル]-[新規作成]-[その他]の[C++Builderプロジェクト]-[データベース]の”データモジュール”を選択してください。

(上図は、Delphiのデータモジュールの新規作成ダイアログの画面)

“データモジュール”のメニューを選択すると、下図のようにデータモジュールの空のフォームが追加されます(ユニット名は、Unit2になります)。

下図は、Delphiの場合

下図は、C++Builderの場合

(3)データモジュールのプロパティを変更する

デザイナ画面で、Delphiの場合は[Unit2]タブを選択、C++Builderの場合は[Unit2.cpp]タブを選択し、データモジュールのフォームを開いて、オブジェクトインスペクタの画面で以下のプロパティを変更します。

プロパティ名
Name SampleDataModule
ClassGruop System.Classes.TPersistent
データモジュールのClassGroupプロパティは、以下の項目から選択できます。
  • System.Classes.TPersistent – Delphi RTLのみ
  • Vcl.Controls.TControl – VCLフレームワークとRTL要素を含む
  • FMX.Types.TControl – FMXフレームワークと RTL要素を含む

特にFMX/VCLの両方で同じデータモジュールを利用する場合は、 フレームワークに依存しない「System.Classes.TPersistent」を選択してください。

(4)フォーム上のFireDACコンポーネントをデータモジュールへ移動する

デザイナ画面で、Delphiの場合は[Unit1]タブを選択、C++Builderの場合は[Unit1.cpp]タブを選択し、フォーム(Form1)を開きます。

キーボードの[Shift]キーを押しながら、フォーム上に配置されているFDConnection1、FDQuery1、FDPhysIBDriverLink1をマウスで選択します。

(上図は、Delphiのフォーム画面で、3つのコンポーネントが選択されている状態)

3つのコンポーネントを選択したら、マウスを右クリックし、ポップアップメニューの [編集]-[切り取り]を選択するか、キーボードのCtrl+Xを押してください。 3つのコンポーネントはフォームから消えます。

続いてデザイナ画面で、Delphiの場合は[Unit2]タブを選択、C++Builderの場合は[Unit2.cpp]タブを選択し、データモジュール(SampleDataModule)を開きます。

データモジュールのフォームの任意の場所をクリックして、マウスを右クリックし、ポップアップメニューの[編集]-[貼り付け]を選択するか、キーボードのCtrl+Vを押してください。 データモジュールのフォーム内にFireDACの3つのコンポーネントが移動します。

フォームに貼り付け直後は、コンポーネントは固まって表示されてしまうことがあるので、 その場合には、データモジュールのフォームのサイズをマウス操作で広げて、各コンポーネントを適当な位置にずらしてください。

(下図は、Delphiのフォーム画面で、3つのコンポーネントがデータモジュールへ移動された状態)

これで、データモジュールへの配置は完了です。

(5)フォームからデータモジュールを参照するコードを追加

データモジュールを追加しても、そのままではフォームから参照できないため、使用することができません。フォームからデータモジュールを参照するコードを追加しましょう。

Delphiの場合

IDEのコードエディタで”Unit1.pas”を開いて、implementation句の下にuses Unit2を追加します。

Unit1.pas

[crayon-672aaeb9c9b21312161205/]

C++Builderの場合

IDEのコードエディタで”Unit1.h”を開いて、#include “Unit2.h”を追加します。

Unit1.h

[crayon-672aaeb9c9b37239054867/]

これで、フォームからSampleDataModuleというデータモジュールの変数が参照できるようになりました。

(6)データセットを開く処理を修正する

フォーム上に配置されているButton1のOnClickイベントコードをデータモジュール(SampleDataModule)の変数を参照するように修正します。

Delphi:

[crayon-672aaeb9c9b39630358661/]

C++Builder:

[crayon-672aaeb9c9b3a998552130/]

(7)ApplyUpdateを実行する処理を修正する

フォーム上に配置されているButton2のOnClickイベントコードをデータモジュール(SampleDataModule)の変数を参照するように修正します。

Delphi:

[crayon-672aaeb9c9b3b596235513/]

C++Builder:

[crayon-672aaeb9c9b3d288352005/]

(8)DataSource1の参照先をデータモジュールに変更する

デザイナ画面で、Delphiの場合は[Unit1]タブを選択、C++Builderの場合は[Unit1.cpp]タブを選択し、フォーム(Form1)を開きます。 オブジェクトインスペクタからDataSource1のプロパティを以下のように変更してください。

DataSource1

プロパティ名
DataSet SampleDataModule.FDQuery1

(9)プロジェクトを保存する

メニューの[ファイル]-[すべて保存] を選択し、全てのファイルを保存してください

(10)アプリケーションを実行する

ツールバー(上図)の実行ボタン、または、キーボードの[F9]ボタンを押します。

(11)アプリケーションの動作を検証する

アプリケーションを実行し、前回の演習の(14)以降の手順を確認してください。 もし同じ結果になれば、データモジュールへの移行は完了です。

以上でこのセクションの演習は終了です。

今回の演習では、1つのフォームからデータモジュールを参照する単純な例でしたが、もしフォーム数が増えても、同様な方法で複数のフォームからデータモジュールを共有できます。データモジュールを利用することで、データベースのリソースを効率良く管理することができるのです。

さらに、データモジュールは、Windows用アプリケーションだけでなく、モバイルアプリやサーバーサイドアプリケーションの開発においても、同じ手法による開発が可能です。つまり、これまで単層や2層で構築していたアプリケーションを、3層以上の多層アプリケーションへ作り替えていく上で、このデータモジュールによる開発手法を役立てることができます。

リソースの効率化やメンテナンス性だけでなく、拡張性も備えたデータモジュールを、ぜひ活用していきましょう。

次回は、従来のTClientDataSetに代わるFireDACのインメモリデータセットであるTFDMemTableの活用方法について説明いたします。

基礎から学べるFireDACデータアクセス再入門

データベースアクセスは、Delphi / C++Builderが得意とする分野です。最新のDelphi / C++Builderでは、FireDACと呼ばれる共通データベースアクセスコンポーネントを使って、多様なデータソースへのアクセスをサポートしています。

そこで本連載では、FireDACの基本的な概念の理解から使い方、さらには応用方法までを学習できる記事を提供。Delphi / C++Builderでの開発経験はあるけれど、FireDACについては詳しくない。あるいは、今回データベースアプリケーションを構築するのに、どのような技術があるのかを知りたい。こんな悩みを抱えている方に最適なシリーズです。

バックナンバーはこちら

モバイルバージョンを終了