【A2】Delphi/C++テクニカルセッション

Delphi/C++ DB総ざらい
アナハイムテクノロジー株式会社・代表取締役
はやし つとむアジェンダ• Delphiからオープンソース系データベースへ接続する際の手順についての概要をまとめて解説します••••

Delphiデータベースプログラミングフレームワーク
Firebird / InterBase
MySQL
PostgreSQL

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

2

Delphiデータベースプログラミングフレームワーク

データベースプログラミングフレームワーク• Delphiは標準で以下のデータベースプログラミングフレームワー
クをサポートしています••••

BDE（Borland Database Engine）
InterBaseExpressdbGo（ADO/OLEDB）
dbExpress• その他サードパーティ製品、オープンソース製品も多数• ZeosLib• FIBPlus• IBObjects• UniDAC

http://zeos.firmos.at/
http://www.devrace.com/en/fibplus/
http://www.ibobjects.com/
http://www.devart.com/products-vcl.html

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

4

BDE（Borland Database Engine）• BDE は、Paradoxをベースとしたフレームワーク。異種DB間でのクエリーのサポートなど、高度な機能もあるが、すでに開発は中止。とはいえ、結構使われている

TDataSource

TDatabase

データアクセス
コンポーネント

TTable

RDBMS
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

5

InterBaseExpress• InterBaseExpress は、InterBaseと接続するためのフレームワーク。InterBaseAPIを直接利用するコンポーネントで構成されている。ベースは、98年に公開されたFreeIBComponents。
• TIBTransactionコンポーネントが分離しているのが特徴• 複数のデータベースへの二相コミットに対応出来る

TDataSource

TIBTransaction

TIBDatabase

データアクセス
コンポーネント

TIBTableRDBMS
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

6

dbGo

• dbGo は、ADO（ActiveX Data Object）をベースとしたフレームワーク。Delphi5でADOExpressとして導入されて、Delphi6からdbGoという名前になった• Firebird / InterBaseに接続するためには、ibProvider が利用できる• ibProvider• http://www.ibprovider.com/eng/• Free Edition は、Firebird2.0、InterBase6まで。
• 有償版では FB2.5、IB2009まで対応
OLEDB Provider

TADOConnection

TDataSource

データアクセス
コンポーネント

TADOTable

RDBMS
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

7

dbExpress• dbExpress4は、Delphi6から導入されたdbExpressの最新版。
Delphi2007でversion 4.0になったが、これまでのドライバも使うことは出来る

TDataSource

dbExpress Driver

TDataSetProvider

TDataSetProvider

TSQLConnection

TSQLTable

データアクセスコンポーネント

RDBMS
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

8

ZeosLib• ZeosLib は、Delphi/C++Builder/Kylix/Lazarus に対応したオー
プンソースのライブラリ••••

http://zeos.firmos.at/
現在の最新版は6.6.5、Delphi2007まで対応
Delphi2009対応は、今後出る予定のver.7までお預け
対応するデータベースが多いのが特徴–––––––––MySQL (normal and embedded)
PostgreSQL
Firebird (normal and embedded)
Interbase
SQLiteMS SQL Server
OracleSybaseADO Connections

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ver.7での対応予定
・Delphi7～Delphi2009サポート
・FPC/Lazarusサポート
・MSEide/MSEguiサポート
・ADO
・MySQL 4.1～6
・InterBase 5 / 6・Firebird 1.0～2.1
・PostgreSQL 7～8
・SQLite 2.8～3・Preparedステートメントのサポート
・Firebird/InterBase以外のDBでイベントサポート
・プロパティエディタの改良

9

各種ネイティブコンポーネント• Delphiから各種データベースへの接続を行う際には、通常は各データベース毎のクライアントライブラリが必要だが、直接データベースと対話出来るプロトコルを実装したものをネイティブコンポーネント（またはネイティブドライバ）と呼ぶ。IBXもその一例。
• Direct Oracle Access 最新版は4.1.2.0• Delphi2009 対応、Oracle11g対応• http://www.allroundautomations.com/doa.html• http://www.teppi.com/Components/DOA/• VCL Data Access Components （ODAC, MyDAC, PgDAC）• Delphi2009対応、Oracle11g / MySQL6.0 / PostgreSQL8.3 に対応• http://www.devart.com/products-vcl.html

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

10

Firebird / InterBase

Firebird / InterBase• Firebird / InterBase は、95年にDelphi1 C/SにInterBase4.0Cがバンドルされて以来、Delphiには必ずInterBaseのローカル版や開発版がバンドルされてきた。

• 2000年にInterBase6がオープンソース化された後、Firebirdがオープンソースプロジェクトとしてフォーク。以降、InterBaseは、6.5 / 7 / 7.1 / 7.5.1 / 2007 / 2009 とバージョンを重ねている。
FirebirdもInterBase6と互換性のある1.0から、1.5 / 2.0 / 2.1とバージョンを重ね、両者の違いも大きくなってきているが、今のところAPIレベルの互換性はほぼ保たれている。

• FirebirdのオープンソースライセンスはMPLベースのIPL/IDPL。
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

12

Firebird / InterBase• Firebird / InterBaseへの接続方法は多種多様なので、ここではdbExpressを基本として説明します。
• dbExpress• 標準INTERBASEドライバ（Firebirdはサポート外）• Devart dbExpress driver for InterBase/Firebird• Upscene InterXpress for Firebird• IBX• FIBPlus• ADO/ODBC経由での接続• ibOleDb• ZeosLib

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

13

Firebird / InterBase• dbExpressでFirebirdに接続する。
• テスト条件：Firebird 2.1.2、DBCharSet=UTF8• 標準ドライバでパラメータクエリは注意が必要• Devartドライバ– 規定値ではUnicode対応がDisableになっているので、TSQLConnectionのParamsに、UseUnicode=Trueを追加する必要がある。

• INTERBASEドライバ– FirebirdのUTF8データベースへの接続には、ServerCharSet=UTF8を指定
InterBase2009の付属ドキュメントではUTF-8とあるが、「-」は使えないのでこれは間違い。
– UTF8を指定して接続した場合、文字型のパラメータがftWideStringになる。この時にAsStringで文字列を渡すとエラーになるので、AsWideStringを使う。

• InterXpressドライバ– 現状ではUnicode対応が出来ていない– その他にも動作に注意が必要

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

14

Firebird / InterBase• dbExpressでInterBaseに接続する。
• テスト条件：InterBase2009、DBCharSet=UTF8• Firebirdと同様、標準ドライバでパラメータクエリで注意が必要• Devartドライバ– 規定値ではUnicode対応がDisableになっているので、TSQLConnectionのParamsに、UseUnicode=Trueを追加する必要がある。

• INTERBASEドライバ– UTF8データベースへの接続なので、ServerCharSet=UTF8を指定する– UTF8を指定して接続した場合、文字型のパラメータがftWideStringになる。この時にAsStringで文字列を渡すとエラーになるので、AsWideStringを使う。
– uses節に、DBXInterBase を追加すること。これがないと、メタデータを取得できないというエラーが発生する。（ GetMetadata=Falseでも・・・）

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

15

Firebird / InterBase• dbExpressのデータをDB系コンポーネントで利用する。（共通）• 一番簡単なのは、TSimpleDataSetを利用すること• TSimpleDataSetは、TSQLConnection+TSQLDataSet+TClientDataSetで一つのコンポーネントにしたようなもの。
• Connectionだけ別のコンポーネントを指定することも可能なので、複数のTSimpleDataSetで接続を共有することも可能。
• TSQLDataSet+TDataSetProvider+TClientDataSetと接続して使用した場合と比べると、Providerの挙動を指定出来ないので細かいことには向かない。
• dbExpressでデータベース系コンポーネントを使うなら、これを使うと大変楽が出来る。

• TSQLDataSet / TSQLQuery / TSQLTable等をTDataSetProvider+TClientDataSetと接続して利用する• Insert / Update / Delete は、プロバイダがSQLを自動生成してくれる。
– 既定値のままだと、Whereに全ての項目を指定したUpdate / Delete動作になるのでこれは変更する。
– 元になるデータセットのフィールドコンポーネントの ProviderFlagsで、キー項目（普通は主キー）のpfInKeyをTrueにする。
– TDataSetProviderのUpdateModeをupWhereKeyOnlyにする。
– Firebird/InterBaseの場合、SQLを大文字で書くこと。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

16

Firebird / InterBase• blobの扱い• BLOB SUB_TYPE 1 （TEXT）のBlobは、WideMemo型のフィールドにマッピングされる。TField.OnGetTextイベントでそのまま展開可能。
• Text := Sender.AsString;• その他の画像データなどのBLOBのINSERT• パラメータに対して、Assign(hoge) とすればよい• 標準ドライバではFirebirdにBlobをInsert出来ない• InterBase2009にはもちろん出来る

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

17

MySQLMySQL• MySQLは、「世界でもっとも普及しているオープンソースデータベース」で、開発元のMySQL社がサンマイクロシステムズ社に買収され、今回Oracleによって買収されました。

• 最新安定版は5.1.35(13/5/2009)で、6.0-Beta(6/4/2009)がリリースされて開発中だったが、5.4-Beta(17/6/2009)が突然リリースされています。これは、5.1のパフォーマンス改善版であるとのことだが、現状では5.1より遅くなるケースもあるとのこと。

• MySQLはストレージエンジンを差し替えて動作することが出来るのが特徴だ
が、6.0ではInterBaseの生みの親のJimStarkeyになるFalconストレージエンジンが実装されている。FalconはMVCCによる完全なトランザクション制御とメモリ上でのバージョンニングによる高速なロールバックを可能としている。

• オープンソース版と有償版があり、オープンソース版のライセンスはGPL。
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

19

MySQL• MySQLへの接続方法はdbExpress、ダイレクト接続、ADO/ODBCなどなどがある。
• dbExpress• MySQLドライバ• Devart dbExpress driver for MySQL• Devart MyDAC --- direct / non direct access• ADO/ODBC経由での接続• ZeosLib

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

20

MySQL• dbExpressでMySQLに接続する。
• テスト条件：MySQL 5.0.83、ServerCharSet=utf8• 標準ドライバ• uses節に、DBXMySQL を追加すること。これがないと、メタデータを取得できないというエラーが発生する。（ GetMetadata=Falseでも・・・）• 標準ドライバのサポートは4.1と5.0のみ。
• MySQL6.0からサロゲートペアがサポートされる予定だが、6.0自体がキャンセルになってしまった・・・。
• その他は、特に問題無し。

• Devart MySQLドライバ

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

21

MySQL• dbExpressからストアドプロシージャを使用する。
• MySQL5.0からストアドプロシージャがサポートされている。
• TSQLStoredProcのSQLConnectionを設定し、必要ならインプットパラメータ（Paramtype=ptInput）のパラメータを設定して、ExecProcするだけ。

dbExpress Driver

TSQLConnection

TSQLStoredProc

MySQL

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

22

PostgreSQL

PostgreSQL• PostgreSQLは、Ingresから派生したオープンソースのORDBMS（自称）です。日本ではSRA OSS社や富士通が担いでいます。PostgreSQLはFirebirdと同様、バージョニング・アー
キテクチャに基づくRDBMSです。

• 最新安定版は8.3.7（16/3/2009）です。8.3ではHOP（Heap Only
Tuples）という新機能が追加され、更新処理が劇的に改善されています。レプリケーションやクラスタへの対応等でも、対応製品が多くOracleの対抗馬と位置付けられます。

• PostgreSQLのライセンスはBDSライセンス。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

24

PostgreSQL• PostgreSQLへの接続方法はdbExpress、ダイレクト接続、ADO/ODBCなどなどがある。
• dbExpress• Devart dbExpress driver for PostgreSQL --- DirectAccess
http://www.devart.com/dbx/• PgExpress driver --- Needs client liblary
http://www.vitavoom.com/products/pgedriver/• Devart PgDAC --- direct access• ADO/ODBC経由での接続• ZeosLib

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

25

PostgreSQL• dbExpressでPostgreSQLに接続する。
• テスト条件：PostgreSQL 8.3.7、Encoding=UTF8• 標準ドライバはないので、Devartドライバ又はpgExpressドライバが必要
だがpgExpressはDelphi2009に正式対応していない上、Devartドライバはクライアントライブラリ不要なので、Devartがお勧め• Devartドライバ– 規定値ではUnicode対応がDisableになっているので、TSQLConnectionのParamsに、UseUnicode=Trueを追加する必要がある。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

26

まとめ

まとめ

• dbExpressでの開発の正否は、ドライバの出来にかかっている。
• 最初はオープンソースのDBで、後々商用DBでというようなプランがあるのであれば、移行しやすいdbExpressは最適。

• 個人的にはFirebirdを推したいが、MySQLやPostgreSQLにも自在に接続出来るので、お好みに合わせてどうぞ。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

28

おまけ

• 吉野家の「吉」（土に口が正解、土吉と表記）はUTF-16のBMP外にあたるサロゲートペア領域にマップされている。

• 「土吉」はU+20BB7、「吉」はU+5409• 「吉野家テスト」を作ってみた。
• Firebird/InterBaseのUTF8、PostgreSQLはOK• MySQLは、5.0までは3バイトまでのUTFしか扱えず、NG（6.0以降は扱えるようになる予定）

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

29

アナハイムテクノロジーについて• アナハイムテクノロジー株式会社• 〒157-0072 世田谷区祖師谷1-22-26-S-208• TEL 03-5787-7791 FAX 03-5787-7792• http://www.anaheim-tech.com/• Delphiとオープンソースの技術支援を行っています• Firebird/InterBaseのご相談もぜひ当社へ！
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

30