Delphi for PHPを使い倒す!

Delphi for PHPを使い倒す!(中編)

データベースコンポーネントの使い方

はやしつとむ
アナハイムテクノロジー株式会社

2009/10/29

簡単DBアプリ作成−サンプルデータベース

 さて、簡単なデータベース接続アプリケーションを作成してみましょう。

 まず、サンプルデータベースを用意します。これはローカルにインストールしてあるFirebird-2.1.3を使いました。

●データベース

 Firebirdのインストールディレクトリにあるaliases.confに以下の内容を追加します

yakitori = c:\database\yakitori.21.fdb

CREATE DATABASE 'yakitori' PAGE_SIZE=16384 DEFAULT CHARACTER SET UTF8;

●テーブル

CREATE TABLE menu(
  id INTEGER NOT NULL PRIMARY KEY,
  product VARCHAR(100),
  price INTEGER,
  seasoning CHAR(1) DEFAULT 'S' NOT NULL,
  start_date TIMESTAMP,
  enabled SMALLINT DEFAULT 1 NOT NULL,
  last_update TIMESTAMP DEFAULT 'NOW'
);

●ジェネレータ

CREATE GENERATOR gen_menu_id;

●トリガー

SET TERM ^ ;CREATE TRIGGER trg_bi_menu FOR menu ACTIVE
BEFORE INSERT OR UPDATE POSITION 0
AS 
BEGIN 
  if (INSERTING AND (NEW.id IS NULL)) THEN NEW.id = GEN_ID(gen_menu_id,1);
  if (UPDATING AND (NEW.last_update = OLD.last_update)) THEN NEW.last_update = CURRENT_TIMESTAMP;
END^
SET TERM ; ^

●サンプルデータ

INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'もも', 126, 'S', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'もも', 126, 'T', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'もも', 126, 'H', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( '砂肝', 147, 'S', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( '砂肝', 147, 'T', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( '皮', 126, 'S', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( '皮', 126, 'T', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( '三角', 147, 'S', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( '三角', 147, 'T', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'つくね', 157, 'S', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'つくね', 157, 'T', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'つくね', 157, 'H', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'ねぎま', 157, 'S', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'ねぎま', 157, 'T', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'ねぎま', 157, 'H', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'ささみ', 147, 'S', '2009/7/1');
INSERT INTO menu (product, price, seasoning, start_date) VALUES ( 'ささみ', 147, 'T', '2009/7/1');

簡単DBアプリ作成−メインフォーム

 まず、新しくメインメニューから新しいアプリケーションを作成します。フォームが1つできるので、そこにボタンを3つとDataSourceの各コンポーネントを配置します。また、DBGridを1つ配置しましょう。それぞれのプロパティを以下のように変更します。

●simple_db_appコンポーネント配置(画像をクリックすると拡大します)
simple_db_appコンポーネント配置

●メインフォーム

  • Caption = Simple DB App
  • DocType = dtXHTML_1_0_Strict
  • Encoding = Unicode(UTF-8)
  • Name = form_main

●DataSource

  • DataSet = dm_main.qry(データモジュールの設定が完了してから指定して下さい)
  • Name = ds

●DBGrid

  • DataSource = ds
  • ReadOnly = true

●Button1

  • Caption = Connect

●Button2

  • Caption = Add new

●Button3

  • Caption = Modify

簡単DBアプリ作成−データモジュール

 次に、メインメニューから[ファイル]−[新規作成]−[データモジュール]を実行して、データモジュールを追加します。

 データモジュールは、フォームと違ってWebブラウザには表示されませんが、非ビジュアルコンポーネントを配置することができるコンテナになるものです。名前のとおり、データベース関連のコンポーネントやメソッドはここへ追加していった方が使い易いでしょう。

 Delphi for Windowsとは違い、フォームを相互に参照する場合には、そのままだとインクルードした方のフォームも表示されてしまいます。これを回避する方法もあるのですが、はっきりいって面倒なのでフォームを相互に参照するのはできるだけ避けて、データモジュールをうまく使いましょう。

 fom_mainの方からは、メインメニューの[ファイル]−[ユニットを使う]でデータモジュールを参照するようにします。

 さて、このデータモジュールにIBDatabaseを1つ、IBQueryを3つ追加して、各コンポーネントを以下のように設定します。

●データモジュール

  • Name = dm_main

●IBDatabase

  • Charset = utf8
  • DatabaseName = yakitori
  • Host = localhost
  • Name = db
  • UserName = sysdba (有効なFirebirdユーザー名)
  • UserPassword = ******** (有効なパスワード)

●IBQuery1

  • Database = db
  • LimitCount = -1
  • LimitStart = -1
  • Name = qry
  • SQL = select
                id,
                product,
                price,
                case seasoning
                  when 'S' then '塩'
                  when 'T' then 'たれ'
                  when 'H' then 'ハーブ'
                end seasoning,
                start_date
              from menu

●IBQuery2

  • Database = db
  • LimitCount = -1
  • LimitStart = -1
  • Name = qry_insert
  • SQL = insert into menu
              (product, price, seasoning, start_date)
              values
              (?, ?, ?, ?)

●IBQuery3

  • Database = db
  • LimitCount = -1
  • LimitStart = -1
  • Name = qry_update
  • SQL = update menu
              set
                product = ?,
                price = ?,
                seasoning = ?,
                start_date = ?
              where
                id = ?

簡単DBアプリ作成−コーディング

 ここまでの準備ができたら、Button1をダブルクリックしてform_mainにボタンのイベントハンドラを追加して、ここに以下のコードを追加します。

 データモジュールの各コンポーネントおよびメソッドには、[ユニットを使う]でdm_mainをrequire_once()した上で、各イベントハンドラ内で利用するたびに、global宣言してアクセスします。

       function Button1Click($sender, $params)
       {
         global $dm_main;
         if($dm_main->db->Connected == false)
         {
           $dm_main->db->Open();
           $dm_main->qry->open();
           $this->Button1->Caption = 'DisConnect';
         } else
         {
           $dm_main->qry->close();
           $dm_main->db->Close();
           $this->Button1->Caption = 'Connect';
         }
       }

 とりあえずこれだけで、データベースに接続してDBGridに内容を表示したり、切断したりできるようになりました。

●Simple DB Appを実行する
Simple DB App実行
prev
2/3
next

Index
データベースコンポーネントの使い方
  Page1
データベースコンポーネント
ネイティブか、それとも汎用か、それが問題だ!
InterBaseコンポーネントの機能追加
Page2
簡単DBアプリ作成−サンプルデータベース
簡単DBアプリ作成−メインフォーム
簡単DBアプリ作成−データモジュール
簡単DBアプリ作成−コーディング
  Page3
簡単DBアプリ作成−レコードの追加(1)
簡単DBアプリ作成−レコードの追加(2)
簡単DBアプリ作成−レコードの追加(3)

index Delphi for PHPを使い倒す!

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間