Delphi / C++Builder : dbExpressを使用したプロジェクトからFireDACへ移行するスタディ

# Delphi / C++Builder : dbExpressを使用したプロジェクトからFireDACへ移行するスタディ

弊社開催の刷新セミナー（いわゆる移行セミナー）において、Delphi/C++Builder の過去のデータベース接続コンポーネントのBDEから最新のFireDACへと移行する手順をご紹介していますが、ご来場の方々にお聞きしますとますと、BDEではなく、dbExpressをお使いの場合も多く見受けられます。また、このdbExpressからFireDACへと移行する手順も知りたいとのご要望をいただくこともあります。ということで、刷新セミナーではお知らせしていないdbExpressからのFireDACへの移行手順について、スタディするブログを掲載しておきます。

BDE, dbExpress, FireDAC。どれもデータベース接続のコンポーネントです。

* dbExpress とは
いまや使用非推奨コンポーネントとなった以前のDB接続コンポーネント群です。いずれなくなりますが、2017年9月時点での最新版 10.2 Tokyoでも未だに使用できます。 いずれなくなります。

* FireDACとは
最新のDB接続コンポーネント群です。コンポーネントベースで視覚的にDB接続を行うことができ、その接続の容易さ、DB利用がよりかんたんにできて高効率であるなどのことから高い評価を得ています。

ということでFireDACへ移行がお勧めです。ここではdbExpressからFireDACへの移行をする上でのポイントを学ぶため、でもプロジェクトを使って書き換えを行ってみます。

----
### デモ&スタディ内容の基本となる資料
まずはデモ&スタディ内容の基本となる資料について、どこを参照しておけばよいかお伝えします。 Embarcadero DocWiki の以下のページにあります。

* [dbExpress アプリケーションの FireDAC への移行](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/DbExpress_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE_FireDAC_%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C)

実際にdbExpressを称したプロジェクトをFireDACへと移行してみる手順はこちらに記載されています。

* [dbExpress アプリケーションの移行（FireDAC）](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/DbExpress_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%A7%BB%E8%A1%8C%EF%BC%88FireDAC%EF%BC%89)

ここでは、上記の「dbExpress アプリケーションの移行（FireDAC）」に記載されている例を実際に試してスタディしていただくにあたり、Delphi / C++Builder / RAD Studio 10.1 Tokyo(以降 RAD Studio、とだけ記載します） を使用して行う場合の手順や、追加情報、さらなるチップスなども合わせてご紹介してまいります。このブログでは、RAD Studioに付属の無料変換ツール「reFind」を使用したケースを記載しておきます。


###[ステップ 1. スタディに使用するデータの用意]
デモ・スタディに使用するdbExpressを使ったソースコード・プロジェクトは、RAD Studioをインストールしていればデフォルトで以下のフォルダにて提供されています。

* C:\Users\Public\Documents\Embarcadero\Studio\\**19.0**\Samples\Object Pascal\Database\FireDAC\Tool\reFind\DBX2FDMigration\Demo

この「Demo]フォルダをわかりやすい任意の場所にコピーしておいてください。（例えばC:ドライブ直下などに）今回のブログでもC:直下に `c:\Demo`としてコピーして実施します。

※Path内で19.0と記述されている部分について。10.2 Tokyoをインストールしている場合は、「19.0」になっています。この部分は一つ前のバージョン10.1 Berlinであれば 「18.0」となり、今後、さらに新しいバージョンがリリースされれば「20.0」と進むことでしょう。

###[ステップ2. 移行/変換ツール reFind を使ってdbExpressの定義をFireDACの定義へと変換]
ここで reFindを実行します。 デモファイル群がデフォルトパスにあるのであれば下の記述をそのまま使えばOKです。
[cmd]で起動するコマンドラインツールを管理者権限で実行し、cd コマンドを使って `c:\Demo\Fomrs` フォルダに移動します。
そこで下記コマンドを実行して、dbExpressの定義をFireDACの定義へと変換します。

`"C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\reFind.exe" *.pas *.dfm /X:"C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind\DBX2FDMigration\FireDAC_Migrate_DBX.txt"`

上の記述は
 
* **reFindのあるパス** (C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\reFind.exe)
* **ファイルフィルタ** (*.pas *.dfm)
* **Xオプションでルールファイルのファイル指定**
 (/X:"C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind\DBX2FDMigration\FireDAC_Migrate_DBX.txt)

という文構成で実行したものであります。使用法とオプションの説明などの詳しくはreFind のヘルプ "/?" をご参照ください。

実行できていると下記ような画面が表示されているはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/ef44cb51-3d42-4fb6-8c6e-b5e31c37fe65.png)

これでdbExpressからForeDACへ必要な定義名の文字列変換が終わりました。
文字列変換の相関については[dbExpress 名に相当する FireDAC 名](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/DbExpress_%E5%90%8D%E3%81%AB%E7%9B%B8%E5%BD%93%E3%81%99%E3%82%8B_FireDAC_%E5%90%8D)に記述がありますが、この記述内にもある通り、変換のすべては、reFindのパラメータでも 指定している「FireDAC_Migrate_DBX.txt」に記載されています。

###[ステップ 3：FireDAC 接続定義の設定]
残念ながらdbExpress の接続定義は自動でFireDACの接続定義へと変換されていませんので、手動でdbExpressの接続設定をFireDAC用に変更します。

1. RAD Studioを起動します
2.  メニューの[ツール]-[FireDACエクスプローラ]を選択して、FireDACエクスプローラを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/fa9c61d3-6002-126d-f733-d4735699bb7e.png)
3. [ファイル] - [新規作成(N)...] -> [Connection Definition Ctrl+N] を選択して新規接続の定義を開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/40a9c4a9-5d6f-4332-5d56-4f1e5cfa1dd6.png)
4. オブジェクトエクスプローラーに緑の「＋」と共に新規[ConnectionDef1]が表示されています。これを右クリックして表示されるコンテクストメニューから[名前の変更]を選び、名称を「MO」と変更しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/aec8e7c4-40f7-1cb8-a151-ce8f55b42bd7.png)
1. 今度は右側のペインで、次の設定を行います。
    * ドライバID = IB
    * Database = C:\Demo\Database\MEETINGORGANIZER.GDB
    * User_Name = sysdba
    * Password = masterkey
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/9ffa78b5-0cae-c154-82c0-6d07555aa7ca.png)
<br>こんな感じです。
1. メニューから[編集] - [適用 Ctr+A] を選択します。左側オブジェクトエクスプローラの「MO」の左に表示されていた緑の「+」が表示されなくなるはずです。
2. 左側オブジェクトエクスプローラの「MO」の左に表示されている小さな[+]をクリックして展開しようとすると、「FireDACログイン」ダイアログが表示されます。このままOKを押します。設定が正しければ、TableやViewなどのサブノードが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/43581e1e-54c8-d405-1224-321d246708e6.png)

以上で接続定義の設定は終了です。 RAD Studioを一度終了してください。 


###[ステップ 4. FireDACで別建てになったドライバやWaitingカーソルの設定]


1. C:\Demo\Forms\MeetingOrganizer.dproj をダブルクリックします。<br> RAD Studioが起動してきてMeetingOrganizerプロジェクトが開かれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/e82c8fba-38b9-4362-18b0-4134553521c5.png)
2. 左側のプロジェクトマネージャーで「uMainDM.pas」をダブルクリックして開き、「uMainDM」のデザインフォームを表示させます。
3. 右下ツールパレットよりInterBase向けドライバリンクの「TFDPhysIBDriverLink」 コンポーネントをプロジェクトにドロップします。
4. 同じく右下ツールパレットよりう待機カーソル制御の「TFDGUIxWaitCursor」 コンポーネントをドロップします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/8a308d2b-ab33-4486-41ac-42ed2acd75ec.png)

###[ステップ5. TFDConnectionの接続パラメーターの設定]
そのまま、uMainDM.pas ファイルで次の変更を行います。
Docwikiの記述では、エディタでテキストをいじって変更していますが、デザインフォーム上で変更可能であります。ここではデザインフォーム上で変更してみます。

1. SQLConnection (TFDConnection) コンポーネントを選択します。
2. オブジェクトインスペクタの「Params]右側「(TFDConnectionDefParams)」と表示されているところをダブルクリックして「文字リストの設定」ダイアログを開きます。
3.「文字リストの設定」ダイアログ内に表示されている文字列を全部削除し、[OK]ボタンをクリックします。
<br> ※ここでは全部消しをして、再設定を行いますが、より詳細な設定を行う場合には[dbExpress 接続の移行（FireDAC）](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/DbExpress_%E6%8E%A5%E7%B6%9A%E3%81%AE%E7%A7%BB%E8%A1%8C%EF%BC%88FireDAC%EF%BC%89)を参考にしてください。
4. SQLConnectionコンポーネントを選択して、右下の「オブジェクトインスペクタ」より、「ConnectionDefName」に`MO`と記述します（[ステップ 3：FireDAC 接続定義の設定]で設定した接続設定定義名です）
5. SQLConnectionをダブルクリックして、FireDAC接続エディタダイアログを開きます。
6. 下記の設定となっていること、確認してください。
     * 接続定義名: MO
     * Database=C:\Data\MeetingOrganizer.gdb
     * User_Name=sysdba
     * Password=masterkey
1. [テスト]ボタンをクリックします。FireDACログインダイアログが表示されるので、「OK」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/fdf11f8d-d42a-06ca-705d-6e72c561b7e6.png)
<br>これで設定がうまくいっていれば「接続の確立が成功しました。」と表示されます。[OK]ボタンをクリックして閉じます。
1．FireDAC接続エディタダイアログも[OK]ボタンをクリックして閉じます。

次に、dbExpress時代の設定ファイルを読み込んでいたコードがありますので、こちらのコードを削除します。 dbExpressを使用しなくなったので、この設定ファイルの読み込みのコードもいらなくなった、ということですね。

1. RAD Studio画面中央下の[コード]をクリックしてコードを表示させます。
1. 手続き SQLConnectionBeforeConnect の実装をコメントアウトします。

```delphi
procedure TMainDM.SQLConnectionBeforeConnect(Sender: TObject);
begin
//  SQLConnection.LoadParamsFromIniFile
//    (IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) +
//    'dbxconnections.ini');
end;
```

###[ステップ 6. データベースマッピングの互換性設定を行う]
InterBase dbExpress ドライバと FireDAC InterBase ドライバはデータ型マッピングがほぼ同じです。しかし、マッピングや動作が少し異なる場合があります。それらを統一するには、以下を行います。

1. SQLConnection TFDConnection コンポーネントを uMainDM.pas ファイルで選択します。
［オブジェクト インスペクタ］で以下を設定します。
2. FormatOptions.DataSnapCompatibility プロパティを True に設定します。
1. FormatOptions.StrsTrim プロパティを False に設定します（このプロパティのデフォルト値は、dbExpress との互換性がありません)。

###[ステップ 外 ：その他]

上記までがDocWiki内の記載で、これでコンパイルすると、コンパイルも通り、ビルドも可能で、動作します。
しかし、MeetingManagerウインドウのDate入力の部分がいわゆるUS表記で MM/DD/YYYY表現になっています。これを修正しておきます。Date入力が参照しているのはSTARTDATEフィールドなのでこの設定を変えます。

1. 右上のプロジェクトマネージャーで「uMeetingDM.pas」をダブルクリックして「uMeetingDM」のデザインフォームを開きます。
2. 「cdsCOntrol」コンポーネントを選択します。これをダブルクリックして、cdsCOntrolのフィールド一覧を表示します。 
3. フィールド一覧になるSTARTDATEをクリックして選択状態にします。
4.左下オブジェクトインスペクタ EditMask の値を `!9999/99/00;1;_`に設定します。

##実行しましょう！
ビルドして実行してみましょう。F9キーを押して実行できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/d5196904-c35d-d621-dc38-fdb7e32ad9e1.png)
アプリのユーザーログインダイアログが出てきますので
User Login に borland
Password に borland 
を入力してください。 Meeting Organizer アプリが起動してきます。
Userメニューで使用ユーザーをマスタ登録、 Roomメニューで会議室をマスタ登録して、
Meeting Manager メニューで会議室予約をするアプリです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145847/f2c59a7d-f6d6-c449-3bb3-ddfc23e98373.png)

今回の移行デモはとても簡単な例ですが、dbExpressからFireDACへの移行はお持ちのプロジェクト・コードによってさまざま変更しなければならない点が出てまいります。
これらの対処のについては、Docwiki上のヒントもご参照ください。

* [dbExpress の移行に関するその他のヒント（FireDAC）](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/DbExpress_%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%83%92%E3%83%B3%E3%83%88%EF%BC%88FireDAC%EF%BC%89)

以上がdbExpress から FireDACへ移行するためのスタディになります