C++Builder 2009 ファーストガイド 第十回「データベースアプリケーションの作成」

By: Tomohiro Takahashi

Abstract: データベースアプリケーションの作成に関する説明です。

このファーストガイドは、これからC++Builder 2009を使い始める初心者の方を対象に10回に分けて基本的事項を説明していきます。

最終回にあたる第十回では、C++Builderを使って簡単なデータベースクライアントアプリケーションを作成する手順について説明していきます。なお、使用するデータベースサーバーとしてオープンソースの「MySQL 5.0」、データベース接続アーキテクチャとしてC++Builder 2009に標準搭載されている「dbExpress」を使用します。

    dbExpress の概要

dbExpress は、古いバージョンの Delphi や C++Builder のBDE(Borland Database Engine)と比較して、C++Builder 6から導入されたデータベースアクセスコンポーネントのセットです。これらのコンポーネントを使うことにより、BDEのような特別なランタイムレイヤを配布しなくても、サポートされているデータベースサーバーのクライアントソフトウェアを利用するだけで、簡単にデータにアクセスできるようになります。このようなことが可能になるのは、dbExpress コンポーネントが適切なデータベースサーバー API 呼び出しをラッピングするからです。すなわちこれらのコンポーネントは、データベースクライアントソフトウェアと直接やり取りして、要求された処理を実行します。C++Builder 2009に標準搭載されたdbExpress でサポートされるデータベースサーバーの種類については、「CodeGear Delphi 2009 および C++Builder 2009 のリリース ノート」の「サポート対象サーバー」の項目を参照してください。また、Professional版のdbExpress には、ライセンス上の制限が規定されており、構築したアプリケーションとは別のリモートサーバー上で稼動するデータベースシステムには接続できませんので、予めご了承ください。ライセンスの詳しい内容については、「Delphi and C++Builder 2009 End User License Agreement」(英語)や、製品に付属するその日本語訳を参照してください。

ツールパレットの[dbExpress]カテゴリ

Hide image
d1

データベースサーバーアクセスをカプセル化することに加えて、dbExpress には以下の特徴があります。

  1. スピード。dbExpress コンポーネントはデータベースクライアントソフトウェアと直接交信するので、データベースアクセスの面で高いパフォーマンスが得られます。
  1. サーバー固有の機能へのアクセス。dbExpress コンポーネントは、サーバー固有の機能へのアクセスを提供します。これには、同じサーバー接続を使った複数の並行トランザクション機能などが含まれます。
  1. C++Builder のデータアクセスアーキテクチャへの高い適合性。TSQLTable、TSQLQuery、TSQLStoredProc、および TSQLDataSet コンポーネントはすべて TDataSet コンポーネントの下位コンポーネントなので、C++Builder に提供されている多くのデータベース対応コントロールと協調動作します。

    dbExpress を使ったデータベース接続

dbExpress コンポーネントの概要とそのメリットを簡単に説明しました。ここでは、dbExpress コンポーネントを使って簡単なデータベースアプリケーションを作成しましょう。第九回まではIDEの使い方やC++言語に関して学んできましたが、ここからはアプリケーションのデータベース接続に焦点を絞って説明していきます。

    MySQL 5.0のインストール

まず、データベースサーバーとして「MySQL 5.0」をダウンロードします。下記のMySQLのWebサイトで公開されている「MySQL 5.0 Community Server」の「Windows downloads」から「Windows ZIP/Setup.EXE (x86)」を選択してください。

http://dev.mysql.com/downloads/mysql/5.0.html#downloads

次に、ダウンロードしたアーカイブ内にある「Setup.exe」を起動して、インストールを開始します。デフォルトの設定でインストールを開始し、しばらくするとインストールが終了します。

インストールが終了したら、MySQLサーバーの設定を行うために「Configure the MySQL Server now」のチェックボックスが有効になっていることを確認して「Finish」ボタンをクリックします。

Hide image
d3

「MySQL Server Instance Configuration Wizard」が起動しますので、デフォルトのキャラクタセットを設定するページで「Manual Selected Default Character Set / Collation」のラジオボタンを有効にし、[Character Set]の項目で「utf8」を選択します。これにより、MySQLの文字列型カラムでUnicodeが扱えるようになります。

Hide image
d4

また、「Windowsに関するオプション」を設定するページで「Include Bin Directory in Windows PATH」のチェックボックスを有効にします。これにより、dbExpressが必要とするMySQLのクライアントソフトフェア「libmySQL.dll」をロードすることが容易になります。

Hide image
d5

最後に、管理者である「root」ユーザーのパスワードを入力して、MySQLサーバーの設定を完了します。上記以外の設定内容は、ウィザードが示すデフォルトの内容のままにしておきます。

Hide image
d6

サーバーのインストールおよび設定を終えたら、実際にMySQLサーバーに接続してみましょう。コマンドプロンプトを起動して「C:\...\>mysql h 127.0.0.1 u root -p」を実行するとrootユーザーのパスワードを求められますので、上の図で指定したものと同じパスワードを入力します。正しく接続できたら「status;」コマンドを実行して、以下のような出力が得られれば、MySQLのインストールおよび起動が正しく完了しています。

Hide image
Click to see full-sized image

では、これからC++Builderで作成するアプリケーションからアクセスすることになるサンプルのデータベースを作成しましょう。上のコマンドプロンプトの状態で「create database dbxtest;」を実行してください。

Hide image
Click to see full-sized image

    データエクスプローラからMySQL 5.0に接続する

C++Builderのデータエクスプローラを使って、上で作成したデータベース「dbxtest」に接続してみます。データエクスプローラを表示するには、メニューから[表示]-[データエクスプローラ]を選択します。

    dbExpressの接続設定

データエクスプローラの[MySQL]ノードを選択し、ポップアップメニューから[新規接続の追加]を選択します。[新規接続の追加]ダイアログボックスが表示されますので、プロバイダ名に[MYSQL]、接続名に[DBXTEST]と入力して[OK]ボタンをクリックします。

Hide image
d.19

次に、新規に作成された[DBXTEST]ノードを選択し、ポップアップメニューから[接続の変更]を選択します。[接続の変更]ダイアログボックスが表示されたら、以下のように接続情報を入力します。Hide image
d9

さらに、接続するMySQLサーバーのキャラクタセット「utf8」に対応するための作業が必要です。上の図で[拡張]ボタンをクリックし、「拡張プロパティ」ダイアログボックスを表示させたら、[ServerCharSet]の項目に「utf8」を指定します。

Hide image
d10

各項目の設定が完了したら、[接続の変更]ダイアログボックスの[テスト接続]ボタンをクリックします。下記の図のようなメッセージボックスが表示されるはずです。これでdbExpressを使って、MySQLサーバーに接続する準備が出来ました。[OK]ボタンをクリックして、ダイアログボックスを閉じます。

Hide image
d11

    テーブルの作成

ここでは、dbxtestデータベースにテーブルを作成してみます。[DBXTEST]ノードの中の[テーブル]ノードを選択し、ポップアップメニューで[テーブルの新規作成]を選びます。[テーブル設計:DBXTEST]のビューがIDEに表示されますので、以下のように「customer」テーブルを定義します。テーブル定義を保存するには、ポップアップメニューから[テーブルの保存]を選択します。

Hide image
d12

名前

データ型

精度

ヌラブル

一次キー

id

int

デフォルトのまま

NULL不可

有効

fullname

varchar

16

NULL不可

なし

address

varchar

64

NULL不可

なし

    サンプルデータの入力

テーブルの作成が完了したら実際にデータを挿入してみます。[テーブル]ノードの中の[customer]ノードをダブルリックします。[dbExpress:DBXTEST: customer]のビューがIDEに表示されますので、以下のようにサンプルとなるデータを入力し、保存します。入力したデータを保存するには、ポップアップメニューから[更新]を選択します。

Hide image
d13

    dbExpress コンポーネントの概要

ここでは、ツールパレットの[dbExpress]カテゴリに用意されているコンポーネントの中で主要なものを紹介します。なお、これらのコンポーネントについてもっと知りたい場合には、製品に付属するオンラインマニュアル、または、エンバカデロのWebサイトで参照可能なドキュメントをご活用ください。

TSQLConnection。データベースサーバー接続をカプセル化するコンポーネントです。すべてのデータセットコンポーネントは、SQLConnection コンポーネントを使ってデータベースにアクセスします。

TSQLDataSet。汎用のデータアクセスに使用されるこのコンポーネントは、TSQLQuery、TSQLTable、および TSQLStoredProc コンポーネントで利用可能な機能の多く(全部ではありません)をサポートします。CommandType プロパティは、どのような動作が求められるかをコンポーネントに指示するために使います。このコンポーネントは、実行時の指定に応じてアプリケーションにいろいろなデータアクセス動作を持たせる場合に便利です。TSQLQuery、TSQLStoredProc、および TSQLTable と同様に、TSQLDataSet は読み取り専用の単方向の結果セットを返します。このコンポーネントは、TDataSetProvider および TClientDataSet コンポーネントと組み合わせて使います。

TSQLQuery。データベースサーバーに対して任意の SQL 文を実行できるようにするデータセットコンポーネントです。このコンポーネントを使うと、SELECT コマンドを使ってデータを取得したり、INSERT、UPDATE、および DELETE コマンドを使ってデータを更新できるようになります。ログインしたユーザーが適切なパーミッションを持っていれば、CREATE TABLE 等のデータ定義コマンドを実行することができます。

TSQLStoredProc。データベースに対するストアドプロシージャへのアクセスをカプセル化するデータセットコンポーネントです。TSQLStoredProc コンポーネントは、データ行を返すストアドプロシージャとデータ行を返さないストアドプロシージャの両方を実行できます。結果セットを取得しないストアドプロシージャを実行するには、ExecProc メソッドを使います。結果セットを取得するには、Open メソッドを呼び出すか、または Active プロパティに true を設定します。

TSQLTable。単独のデータベーステーブルへのアクセスをカプセル化するデータセットコンポーネントです。TSQLTable コンポーネントは、SQL 文を入力せずにデータベース内の 1つのテーブルまたはビューにアクセスするために使います。

TSimpleDataSet。このコンポーネントは、特殊な TClientDataSet コンポーネントで、内部の TSQLDataSet および TDataSetProvider コンポーネントを使ってデータの取り出しと更新を行います。このコンポーネントは、TClientDataSet のデータの編集およびナビゲート機能に加えて、単方向データセットの高速アクセスと配布の容易さを合わせ持つコンポーネントです。

    dbExpress コンポーネントを使ったデータアクセス

ここでは、上で説明したdbExpressコンポーネントやデータベース対応のビジュアルコンポーネントを使用して、実際にデータベースクライアントアプリケーションを作成してみます。

    TDBGridコンポーネントにデータを表示する

まず、[ファイル]-[新規作成]-[VCLフォームアプリケーション – C++Builder]を選択して、空のメインフォームを持つアプリケーションを新規に作成します。プロジェクトとして保存したら、データエクスプローラの[DBXTEST]ノードを選択し、そのメインフォーム上にドラッグ&ドロップします。次に、ツールパレットからTSimpleDataSetコンポーネントを探して、同じくメインフォーム上にドラッグ&ドロップします。フォーム上のTSimpleDataSetコンポーネントを選択し、オブジェクトインスペクタで次のようにプロパティを設定します。

プロパティ

値またはリンク先

Connection

DBXTEST

DataSetCommandType

ctTable

DataSetCommandText

customer

ツールパレットからTDataSourceコンポーネントおよび、TDBGridコンポーネントをそれぞれメインフォーム上にドラッグ&ドロップします。そして以下のようにプロパティを設定します。

プロパティ

値またはリンク先

TDataSourceDataSet

SimpleDataSet1

TDBGridDataSource

DataSource1

最後に、TSimpleDataSetコンポーネントのActiveプロパティをtrueに設定すると、以下のようなデザイン画面が得られます。

Hide image
d15

    TDBEditコンポーネントにデータを表示する

ここでは、上で説明したTDBGridを使ってテーブル全体を表示・編集する機能のほかに、TDBEditコンポーネントを使用して行ごとにデータを表示・編集する機能を追加してみようと思います。まず、メインフォーム上のTSimpleDataSetコンポーネントを選択し、ダブルクリックします。永続化フィールドと呼ばれるコンポーネントを定義するポップアップウィンドウが表示されますので、そこでポップアップメニューから[すべての項目の追加]を選択します。これによりcustomerテーブル内の全フィールドが認識されるはずです。認識された全フィールドを選択し、メインフォーム上のTDBGridコンポーネントの下部にドラッグ&ドロップします。この結果、次の図のように、行ごとにデータを表示・編集できるTDBEditコンポーネントが自動的に配置されます。

Hide image
Click to see full-sized image

    編集したデータを保存する

では、上のように設計したアプリケーションに、編集したテーブルデータをサーバーに保存するコードを追加してアプリケーションを完成させましょう。ツールパレットからTButtonコンポーネントをメインフォーム上にドラッグ&ドロップし、そのCaptionプロパティを「保存」に変更し、さらにOnClickイベントハンドラを以下のように記述します。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int err = SimpleDataSet1->ApplyUpdates(-1);
  if( err == 0 ) {
    ShowMessage("保存しました。");
  }
}

ApplyUpdatesメソッドの引数には、データをサーバーに保存する際に発生するエラーの上限回数を指定でき、エラーの回数が上限に達した段階でデータの保存処理を中断させることができます。「-1」は、エラーの回数が無制限であることを意味します。ApplyUpdatesメソッドの戻り値として、発生したエラーの回数が返ってきますので、「0」であれば全てのデータの保存が成功したことを意味します。

これで簡単なデータベースクライアントアプリケーションの完成です。実際に実行して、データの編集・保存を行ってみましょう。「保存しました。」のメッセージボックスが表示されれば、データの保存に成功しているはずです。データエクスプローラやMySQLクライアントを利用して確認してみてください。

Hide image
d18

    まとめ

最終回の第十回では、dbExpressを使ったデータベースアクセス手法を中心に説明しました。dbExpressを使えば、いとも簡単にデータベースクライアントアプリケーションが作成できることがお分かりいただけたと思います。BLOB型やトランザクションに関する処理などまだまだ解説すべき話題もありますが、今後機会があればそれらの機能を紹介したいと思います。

Server Response from: ETNASC02