【B2】D l hi/C B ild テク カルセ シ ン【B2】Delphi/C++Builderテクニカルセッション

エンバカデロ・テクノロジーズ
エヴァンジェリスト 高橋 智宏

BDEアプリを最新へ – FireDACによる移行

はじめに
 BDEの現状
 BDEから移行がなぜ必要なのか
 BDEからの移行の壁
 FireDACについて
 Paradox/dBaseユーザー向けの移行
 BDEからFireDACへ移行のポイント
 FireDACのデモ
 まとめ

BDEアプリを最新へ – FireDACによる移行

BDEとは?
 旧Borland社が提供したデータベースアクセスを共通化するミド ウ化するミドルウェア(古くはIDAPI と呼ばれたDBアクセスエンジン)
 複数のアプリケーションで共有できるデータアクセスメ
プデカニズム BDEと併せて“SQL-Link”というミドルウェアを利用することで主要なRDBMSへネイティブ接続が可能
 Delphi/C++Builderで開発されたアプリケーションと共開発された プリケ シ と共に利用され、広く普及している

BDEの特徴 (その1) 共通の手順で様々なDBへアクセス可能
BDEユーザーはデータベースの違いを意識することなく、異なるシステムへ同じ手順でアクセスできる

 BDEの機能を直接使用するための API を提供
BDE API は、Windows DLL をロードし、その中の関数を使用できるプログラミング
言語であれば どの言語からも呼び出せる(Delphi/C++Builder以外からも利用可)
言語であれば、どの言語からも呼び出せる(Delphi/C++Builder以外からも利用可)
BDEオブジェクトは、BDE API(DBIxxxx)をラップしたコンポーネント

 幅広いデータベースのサポート
幅広 デ タベ
サポ ト
Paradox、dBASE、AccessなどのファイルベースDB
IInterBase、Oracle、Sybase、MSSQL、DB2、InformixB
O l S bMSSQL DB2 I fi などのRDBMSODBCを介してさらに多くのデータベースへ接続も可能

BDEの特徴 (その2) 異種結合異なるデータベースに属する 2 つのテーブルを結合可能
例えば、SELECT *FROM ":DBDEMOS:Customer.db" C, ":BCDEMOS:Orders.db" O
WHERE (C.CustNo = O.CustNo)
異種結合できるのは BDE（ローカル，ODBC，または SQL-Link）で アクセス可能なデータベースタイプのテーブル

BDEのよくある旧システムの構成例
Oracle 8i をターゲットに Delphi 7で作成されていたC/Sシステム(Delphi 7 + BDE + SQL-Link
SQL Link for ORACLE + Oracle 8i)

クライアントPC
クライアントアプリケーション

BDE
Oracle用SQL-Linkドライバ
Oracleクライアントライブラリ
oci.dlltnsnames.ora

DB
Oracle 8i

BDEの現状
 BDEは2002年に開発
BDEは2002年に開発・保守終了
保守終了
不具合があっても修正パッチの提供は無し

 BDEの最新バージョンは、5.2
・Delphi 7/C++Builder 6以降、BDEのバージョンは更新されていない
・現在のDelphi /C++Builder製品に付属するBDEは、あくまで過去の資産の保守用

 動作保証プラットホームは、Windows XPまで
Windows XP以降にリリースされたOSバージョンは、動作保証外(例えば Wi d(例えば、WindowsVista/7、WindowsVi t /7 Wi d2003/2008 SServerなど)など)

BDEアプリを最新へ – FireDACによる移行

BDE+Paradoxについて
 現在のBDEは、 Paradox/dBaseの保守用
 BDE + Paradoxの短所 (RDBMSと比較して)・トランザクションや排他処理が貧弱
・テーブルのデータが破損しやすい(そのリスクが大きい)
・Paradoxのテーブルサイズの制限( ブロックサイズ × 65535 )・データ量に比例し、パフォーマンス低下やエラーが発生しやすい・Unicodeは当然扱えない

ますますデータの肥大化が進む現状のシステムにおいてこれらの問題を抱えたままParadoxを使い続ける意味があるのか?
抱使 続
意 があ

BDEの抱える問題 (その1) 近年の(PC)ハ
近年の(PC)ハードウェア構成にマッチしない
ドウェア構成にマッチしない
・4GB越えのHDDの空き容量が正しく認識しない
・マルチコア/プロセッサ搭載PC上での動作不安

 Vista以降のOS機能に未対応
・UAC(User Account Control)
・ASLR(Address Space Layout Randomization)によるアドレス衝突が発生
・BDEアプリを複数同時起動した場合、初期化エラーが発生することがある

PCやWindows、そしてBDEの設定を色々変更すればなんとか動作するが、一切の保証は無し

BDEの抱える問題 (その2) 対応しているデ対応しているデータベースのバージョンが古い
タベ スのバ ジョンが古い

ODBC接続によって一応新しいバージョンへ繋がるが一切の保証は無し

BDEの抱える問題 (その3) とにかく配布が面倒
例えば、BDE + SQL-Link for ORACLE + Oracle 8iの構成の場合
クライアントアプリケ シ ン
クライアントアプリケーション
BDE

BDE対応のインストーラ作成が必須

O l 用SQL Li kドライバ
Oracle用SQL-Linkドライバ

BDEのエリアス設定が必須

Oracleクライアントライブラリ

oci.dlltnsnames.ora

クライアントPC

Oracleクライアントのインスト ルが必須
インストールが必須
設定が必須

異なるBDEのバージョン(例えば、4.x)の混在や、エリアスの重複など異なるBDEのバ ジョン(例えば 4 と 5.x5 )の混在やエリアスの重複など実行環境に依存し、問題が生じるケースも多い

BDEの抱える問題 (その4) 最近
最近のニーズに適したアプリケーションが作成できない
適ア リケ シ
作成
な・64ビットアプリ化
・Unicodeへ対応
・クロスプラットホーム化
・マルチデバイスマルチデバイス
・多層データベースアプリケーションへの対応など

BDEを使い続けることのリスク メ
メーカーからのサポートが期待できないカ からのサポ トが期待できない
既にサポートが終了しているため、もしシステムに深刻な問題が発生しても自己責任で利用、回避が必要

 BDEは不安定な土壌で動作しているという認識が必要
・あくまで旧システムとの互換性の範囲で動作しているに過ぎない
あ換性 範囲 動作
過・今後普及していくデバイス、Windows OS、データベース等でも同じ仕様で利用できるとは限らないため、もし仕様が変われば、いずれ動作しなくなる

 既存のアプリケーション資産を様々な分野へ展開できる可能性を自ら閉ざしている・実行環境が固定されるため、アプリケーションの更なる発展は見込めない

”その場しのぎ”や、”延命”もそろそろ限界じゃありませんか?

既存のBDEアプリを最新にアップデートしましょう!
では それをいつやるのか？
では、それをいつやるのか？

今でしょ!

BDEアプリを最新へ – FireDACによる移行

BDEから移行するための選択肢
BDE以外で、従来のDelphi/C++Builderから標準で利用可能なデータベースフレームワークの種類
 IBExpress(InterBase専用)
 dbGO（ADO/OLEDB）（/）
 dbExpress※サードパーティ製品は除く
ィ製品 除おそらくこれらのコンポーネントを利用し、BDEから移行を 度は検討された方も多いと思います
移行を一度は検討された方も多いと思いますサポ ト よくあるお問い合わせ(1)サポートへよくあるお問い合わせ(1)
現在、BDEのTTable(TQuery)から移行中です。
ところがdbExpressのTSQLTable(Query)では、例えば、以下に該当するメソッドやプロパティの見つかりません。
TTable.FetchAll
TQuery.Constrained
TTable UpdateObject
TTable.UpdateObject
TQuery.Data
TQuery.RequestLive
TTable exclusive
TTable.exclusive
存在しないプロパティやメソッドの代替案を教えてください。
上記に依存しているコードが多く上記に依存しているコドが多く、できれば修正したくありません。
できれば修正したくありません

BDE DataSetとの非互換性の例

サポ ト よくあるお問い合わせ(2)サポートへよくあるお問い合わせ(2)Oracleテーブル(レコード数は約100万件)のオープンにかかる時間はBDE  １秒
dbGO(ADO)やdbExpress  ２１秒 かかりました。
テーブルのアクセス方法は、Tableコンポーネントでは、特にフィルタは設定してません。
QQueryコンポーネントでは、”selectンポ ネントでは ” l t * fromf
テ ブル名”で結果セ トを取得
テーブル名”で結果セットを取得しており、where句によってフィルタはしていません。
なぜ同じコードで、BDEとこんなにパフォーマンスが違うんですか?

データアクセスアーキテクチャの違いにより実行パフォ マンスが出ない典型的な例
実行パフォーマンスが出ない典型的な例

BDEからの移行をより困難にする理由
 データアクセスアーキテクチャの違い
デ タアク
ア キテク ャ 違・サーバーサイドカーソルか、クライアントサイドカーソルか・フィルタの指定有無/条件など

 BDE DataSetと非互換(メソッドやプロパティの違いなど)
 同等の実行パフォーマンスが出ない

上記のような理由により、コードの修正が発生し、それにかかる工数が大きいため、なかなか移行に踏み切れないBDEから移行する新たな選択肢
BDE以外で、Delphi/C++Builderから利用可能なデータベースフレームワークの新定番
 IBExpress(InterBase専用)
 dbGO（ADO/OLEDB）（/）
 dbExpress FireDAC New!

※サードパーティ製品は除くBDEアプリを最新へ – FireDACによる移行

FireDACとは？
• 広範なデータアクセスコンポーネント
広範なデ タアクセスコンポ ネント••

あらゆるデータベースアプリケーション開発向け
Delphi および C++Builder 向け••

Win32,Wi32 Win64,Wi 64 Mac
M OS X
Delphi 5～XE3, C++Builder 6～XE3• ハイパフォーマンス且つ、簡単にエンター
プライズデータベースに接続可能• 統一的なデータアクセスが可能•

しかも、データベースに特有な機能も利用可能

FireDACのネイティブドライバ
•
•
•
•
•
•
•
•

MySQL
y Q 3.21以降
以降
Microsoft SQL Server 2000以降
Unicodeに対応!!
Microsoft SQL Azure
Oracle 8.0.3以降
降•Sybase SQL Anywhere 5.0以降
InterBase 6以降•Microsoft Access 2000以降
PostgreSQL 7
7.4以降
4以降 • IBM DB2 8.1以降
DataSnap•
Firebird 1.5以降
SQLite 3.x•
Ad t
Advantage
D
Database
t b8
8.0以降
0以降
••

ODBC接続dbExpressブリッジ接続

http://docs.embarcadero.com/products/rad_studio/firedac/Databases.html

FireDACの構造

FireDACを使用するメリット
 BDEとの互換性
・データアクセスアーキテクチャが類似
・従来のBDE Datasetとの互換性を備えたDataSetクラス
・CachedUpdatesモードも利用可能
ドも利用 能 配布がとても簡単
・専用のデータベースドライバやインストーラーが不要

 BDEと同等以上のパフォーマンス
 Professionalエディションでもリモート接続が可能
P f i l デ シ ンでもリモ ト接続が可能

BDEアプリを最新へ – FireDACによる移行

デ タ
データベースの移行についてスの移行について FireDACは、Paradox/dBaseを未サポ
FireDACは、Paradox/dBaseを未サポート
ト

Paradox/dBaseから別のデータベースへ移行が必要
 代替データベースに関する指針

・各種
各種 RDBMSへ移行
・同じタイプのローカルDBへ移行
例えば、
例えば・XMLファイル
・MS Access・SQLite・InterBase Desktop Editionなど

テ ブルのデ タを移行するにはテーブルのデータを移行するには
 BDEを介し、DataPump(デBDEを介し、DataPump(データポンプ)を利用するタポンプ)を利用する
・データベースへの接続は、SQL-LinkもしくはODBCで行なう
注意点:
・BDEのエリアスを予め設定しておく
・移行先の(入れ物となる)データベースファイルを予め作成しておく
・このユーティリティが付属しているバージョンは、C++Builder6 ,Delphi7 迄 Paradoxから各種RDBMSへ移行するサードパーティ製のツールを利用 自分でデータ移行用のプログラムを作成する
 TClientDataSetを介してXMLファイルへ出力
 http://blogs.embarcadero.com/teamj/2013/03/06/3722/

BDEアプリを最新へ – FireDACによる移行

BDEとFireDACのコンポーネント名
BDEとFireDACのコンポ
ネント名BDE• TDatabase• TSession• TTable• TQuery• TStoredProc• TUpdateSQLp• TBatchMoveなど※FireDAC

TADConnection
TADManager
TADTable
TADQuery
TADStoredProc
TADUpdateSQLp
TADDataMove

一部対応するコンポーネントがあっても、挙動が異なるものがありますFireDACのコンフィグファイル
 BDE Administratorと同様に、FireDAC Explorerによってエリアスの情報を設定ファイルに保存できる・BDEでは、 IDAPI.CFGに保存
・FireDACでは、 ADConnectionDefs.ini に保存
注意
注意:
Windows Vista以降のOSでデフォルトのADConnectionDefs.iniを編集するためには、FireDAC Explorerを[管理者として実行]が必要

BDEのエリアスの移行
FireDAC Explorerのメインメニュー [Connection]-[Import BDE Alias]を選択し、BDE Administratorに設定されている一部のエリアスをインポートできます。
Administratorに設定されている 部の リアスをインポ トできます。

・但し、Paradoxのエリアスはインポートできません・エリアスの移行後、空欄のパラメータは個別の設定が必要

デ タ
データベースドライバの対応表
スドライバの対応表
データベース

BDE(SQL-Link)

FireDAC

Oraclesqlora8.dllqTADPhysOracleDriverLinky

MSSQLServer

sqlmss32.dll

TADPhysMSSQLDriverLink

DB2

sqldb2v5.dll

TADPhysDB2DriverLink

PostgreSQLg

N/A

TADPhysPgDriverLink
y g

MySQL

N/A

TADPhysMySQLDriverLink

SQLiteN/A

TADPhysSQLiteDriverLink

Sybase ASE

sqlsyb32.dll

TADPhysODBCDriverLink

Paradox

idpdx32.dll

N/A

ODBCブリッジドライバ

idodbc32.dll

TADPhysODBCDriverLink

DataSnap

N/A

TADPhysDataSnapDriverLink

InterBase
FireBird

sqlint32.dll

TADPhysIBDriverLink

N/A

FireDACでは、ターゲットのデータベースに応じたゲ
デTADPhysXXXXDriverLinkが必要

TSessionの代替は?
 アプリケーションでデータベース接続を管理する役

割を持つコンポーネント
割を持つコンポ
ネント
BDE

FireDAC

TSession

TADManager

Session変数

ADManager変数

 ADManagerへ接続設定を登録することで、ADM接続設定を登録することでワーカースレッド内で物理接続の再利用を行なう ネ
行なうコネクションプーリングが利用できるプ
グがきるTTableを移行する最良な選択は?
 普通にコンポ
普通にコンポーネントの名前だけで見ると、ネントの名前だけで見ると、

TTable  TADTableへ置き換えたいところですが・・
・TADTableは、利用に関して制限が多く、データの取得の際に余計なラウンドトリップが発生したり、オーバーヘッドが大きい
・TADQueryは、TTableと共通するプロパティやメソッドを持つ・パフォーマンスはパフォ マンスは、TADQueryTADQuery > TADTable

通常は、TADQueryへ置き換えることがベストな選択

デ タ型のマッピング
データ型のマッピング
 FireDACは、dbExpressのデFireDACは、dbExpressのデータ型マッピングに類似タ型マッピングに類似
 BDEからFireDACへ移行すると、RDBMSごとに異なるデータ型マッピングを持っているかもしれませんが、FireDACでは、データ型マッピングを調整するための強力な機能を備えています。

アプリケ ションの配布
アプリケーションの配布
 FireDACは、BDEと比FireDACは、BDEと比べて配布がとってもシンプル!!て配布がとってもシンプル!!
BDEの場合:クライアントアプリケーション

FireDACの場合:
クライアントアプリケーション
TADPhysXXXXDriverLink

BDE
BDE専用のドライバ(例えば、sqlora8.dllやidobc32.dllなど)

DBクライアントライブラリ(例えば、oci.dllやgds32.dllなど)

・ADCConnectionsDefs.ini
・ADDrivers.ini (※)

DBクライアントライブラリ(例えば、oci.dllやgds32.dllなど)※もしFireDACのエリアスを参照していないアプリケーションの場合、この2つのファイルの配布は不要互換性の無いBDEプロパティについて
 FireDACでは、一部 BDEに対応したプロパティを持っていない
BDE プ
プロパティ
パティ

FireDAC プ
プロパティ
パティ

Alias

ConnectionDef

Database

Connection

SessionName

N/A

PrivateDir

N/A※FireDACに存在しないプロパティは、完全に削除が必要

データベースドライバのパラメータの違い
デタベ スドライバのパラメ タの違い
下記は、Oracleドライバのパラメータ同士を比較した例:BDE(SQLLink)

FireDAC※パラメータ名が異なるため、個別に設定が必要になりますCharacterSet パラメ
パラメータタ FireDACでUnicodeデータベースに接続するには？
データベースCharacterSet パラメータ

Oracleutf8 あるいは NLS_LANG=_.UTF8MSSQLSMSSQLServer

自動的にUTF 16がセットされる※
自動的にUTF-16がセットされる※

DB2

自動的にUTF-16がセットされる※

PostgreSQL

utf8

MySQL

utf8

SQLite

自動的にUTF-16がセットされる※

MS Access

自動的にUTF-16がセットされる※

InterBase /Firebird

utf8

Sybase SQL Anywhere

自動的にUTF-16がセットされる※

ODBCブリッジドライバ

自動的にUTF-16がセットされる※

dbExpress ブリッジドライバ

dbExpressドライバに依存※ RAD Studio/Delphi/C++Builder のバージョンが2009以降の場合
2007以前のバージョンはUnicode未対応OnLoginイ ント
OnLoginイベント
 TADConnection.OnLoginイベントは、TDatabase.OnLogin

イベントのパラメ タリストと互換性が無い
イベントのパラメータリストと互換性が無い
procedure TMyDataModule.dbLogin(Connection: TDEConnection; LoginParams:TStrings);i)
begin
LoginParams.Values['USER NAME'] := 'me';
LoginParams.Values['PASSWORD'] := 'pwd';
end;

BDE

例として、以下のようにコードを置き換えれる
procedure TMyDataModule.dbLogin (AConnection: TADCustomConnection;
const AConnectionDef: IADStanConnectionDef);
begin
AConnectionDef.UserName := 'me';
AConnectionDef.Password ::= 'pwd';
pwd ;end;

FireDAC時間のかかる処理
Screen.Cursor := crSQLWait;
ytry......
finally
Screen.Cursor := crDefault;
end;

BDE

例として、以下のようにコードを置き換えれる
uses
uADStanFactory, uADGUIxIntf;......
var
oWait: IADGUIxWaitCursor;......
ADCreateInterface(IADGUIxWaitCursor,f(ioWait);i )oWait.StartWait;try......
finallyoWait.StopWait;
end;
dFireDAC

デ タ
データベースの例外エラーについて
スの例外エラ について
BDEの例外クラス

FireDACの例外クラス

EDBEngineError

EADDBEngineException

エラーの種類を取得するには、ErrorCode
プロパティを使用

エラーを列挙した値を返すKindプロパ
ティを使用

if E is EDBEngineError thenbegincase EDBEngineError(E).Errors[0].ErrorCode of
DBIERR_KEYVIOL: MetaBaseDBError(SMb_DataSetInvalidPKeyValue, E);
end;

BDE

以下のようにコードを書き換える
if E is EADDBEngineException thenbegincase EADDBEngineException(E).Kind of
ekUKViolated: MetaBaseDBError(SMb_DataSetInvalidPKeyValue, E);
end;

FireDAC

注意点
 BDE API を直接呼び出しているプログラムコを直接呼び出しているプログラムコードはドは、そのままでは移行できない
・BDE API(DBIxxxx)とFireDACのAPI(Physy interface)は、全く互換性が無い
ため、 FireDACのAPIを利用して再コーディングが必要

 BDEとFireDACは異種クエリの構文と機能が異なる・FireDACでは、LocalSQLを利用し、BDEのような異種結合が行える機能を提供

 TBatchMoveとTADDataMoveは、機能的に多くの点で異なる (コードの書き直しが必要なケースあり)(コ ドの書き直しが必要なケ スあり)

BDEアプリを最新へ – FireDACによる移行デモ 簡単なBDEアプリからFireDACアプリへの移行 パフォーマンス対決
パフォ マンス対決

dbExpressとFireDACの比較

BDEアプリを最新へ – FireDACによる移行

FireDAC 移行することによってFireDACへ移行することによって・・
 最新のOSやDBのバ
最新のOSやDBのバージョンに対応
ジョンに対応 BDEと同様、共通手順で広範なDBへアクセス アプリケーションの配布がシンプルに
 BDEと同等以上のパフォーマンスが期待
 BDEとの互換性により、移行にかかる工数を最低限に抑えられるさらにアプリケーション資産をニーズに合わせた様々な分野 の展開が期待できる様々な分野への展開が期待できるいつかは、BDEのアプリをア プデ トしなければなりません
アップデートしなければなりません
では、それをいつやるのか？

今でしょ!

FireDACを利用するには？
• Delphi/C++Builder/RAD
p //Studio XE3• Enterprise Editionライセンスに含まれる• 既にXE3を購入済みのユーザーも含む• FireDAC Client/Server Pack for XE3• Professional Editionに追加するアドオン

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

参考情報• FireDACのオンラインヘルプ(英語)オ ラ(英語)http://docs.embarcadero.com/products/rad_studio/firedac/• RAD Studioマイグレ
Studioマイグレーションセンター
ションセンタhttp://www.embarcadero.com/jp/rad‐in‐action/migration‐upgrade‐center