第2回 Kylixからデータベースを操作してみよう

中林 紀彦
日本アイ・ビー・エム株式会社
2003/1/15

データ操作プログラミング手法

 次は、それぞれのデータセットについて検索(SELECT)、更新(UPDATE)、挿入(INSERT)、削除(DELETE)の操作方法を説明します。

単方向データセットによるデータ操作

 dbExpressには次の4種類の単方向データセット・コンポーネントが用意されています。

  TSQLDataSet :SQL文とテーブル、ストアドプロシージャの指定が可能
  TSQLQuery :SQL文の指定が可能
  TSQLTable :テーブルの指定が可能
  TSQLStoredProc :ストアドプロシージャの実行が可能

 最も一般的なのはTSQLDataSetコンポーネントで、単方向データセットは通常このコンポーネントを利用します。TSQLDataSetはSQL文、テーブル、ストアドプロシージャを扱うことができ、ほかの3つのコンポーネントの機能をすべて満たしています。

 実際にアプリケーションを作りながら、TSQLDataSetの利用方法を見ていきましょう。

 まず、[ファイル]−[新規作成]−[アプリケーション]で新しいアプリケーションを準備します。フォーム上にSQLConnectionコンポーネントを配置し、このコンポーネントをダブルクリックしてdbExpressの接続設定を行います。ここでは、SAMPLEデータベースに接続するように設定します(画面1)。

画面1 dbExpressの接続設定

 次に、SQLDataSetをフォームに配置します。SQLConnectionのプロパティを「SQLConnection1」に設定します。次に[Standard]タブからMemoとButtonコンポーネントを配置します。Memo1のLinesプロパティでTStringから「Memo1」を削除します。また、Button1のCaptionプロパティを「O.K.」に変更し、大きさや全体の位置を調整します(画面2)。

画面2 コンポーネントの配置

 [O.K.]ボタンをダブルクリックして、クリック時のイベントを記述します。最初にSQLを準備()し、次にデータセットをアクティブにしてデータを取り出します。まずは、メタデータを取り出してみましょう()。ここまでのコードは、以下のようになります。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;                                                     
begin
        SQLDataSet1.CommandText := 'SELECT EMPNO, FIRSTNME, LASTNAME
 FROM EMPLOYEE';                                                  
        SQLDataSet1.Active := true;                               
        for i := 0 to SQLDataSet1.FieldCount - 1 do               
                Memo1.Lines.Add(SQLDataSet1.Fields[i].FieldName); 
        SQLDataSet1.Active := false;                              
end;

 [実行]ボタンで実行して[O.K.]ボタンをクリックすると、画面3のように表示されるはずです。

画面3 データベースからフィールド名が取得できた

 次にデータを取り出してみましょう。前述のコードに()の部分を加えます。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
        SQLDataSet1.CommandText := 'SELECT EMPNO, FIRSTNME, LASTNAME
 FROM EMPLOYEE';
        SQLDataSet1.Active := true;
        for i := 0 to SQLDataSet1.FieldCount - 1 do
                Memo1.Lines.Add(SQLDataSet1.Fields[i].FieldName);
        for i := 0 to SQLDataSet1.RecordCount -1 do         
        begin                                               
                Memo1.Lines.Add(SQLDataSet1.FieldValues['EMPNO'] + '    ' + SQLDataSet1.FieldValues['FIRSTNME'] + '  ' + SQLDataSet1.FieldValues['LASTNAME']); 
                SQLDataSet1.Next;                           
        end;                                                 
        SQLDataSet1.Active := false;
end;

 これを実行すると、画面4のように表示されます。

画面4 各レコードの値まで取得できるようになった

 以上が、検索操作の方法です。

 次に、結果を返さない更新(UPDATE)、挿入(INSERT)、削除(DELETE)について説明します。基本的には検索(SELECT)のときと同じですが、ExecSQLメソッドを使ってSQLを実行します。ここではデータの挿入(INSERT)を例として試してみましょう。先ほどのイベントのコードを以下のように書き換えます()。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  res: Integer;                                          
begin
        SQLDataSet1.CommandText := 'INSERT INTO EMPLOYEE(EMPNO, FIRSTNME, MIDINIT, LASTNAME, EDLEVEL) VALUES (:EMPNO,
 :FIRSTNME, :MIDINIT, :LASTNAME, :EDLEVEL)';             
        SQLDataSet1.Params[0].AsString := '000350';      
        SQLDataSet1.Params[1].AsString := 'Norihiko';    
        SQLDataSet1.Params[2].AsString := '';            
        SQLDataSet1.Params[3].AsString := 'Nakabayashi'; 
        SQLDataSet1.Params[4].AsInteger := 18;           
        res := SQLDataSet1.ExecSQL;                      
        Memo1.Lines.Add(IntToStr(res));                  
end;

 ExecSQLは影響を受けた行数を整数で返すので、「1」が表示されればINSERT成功です。UPDATEやDELETEも、同じようにExecSQLで実行できます。

クライアントデータセットによるデータ操作

 Kylixでは、TClientDataSetとTSQLClientDataSetの2種類のクライアントデータセットが提供されています。TSQLClientDataSetは、2階層アプリケーション用の特別なクライアントデータセットです。一方、TClientDataSetはプロバイダコンポーネントを併用することで多層のアプリケーションにも対応できます。クライアントデータセットは、TDataSetのプロパティ、メソッドのすべてを継承しています。そのため、INSERT、DELETEに関しては単方向データセットのデータ操作と同様です。

 UPDATEに関しては少し注意が必要なので、サンプルを作りながら説明します。

 先ほどと同じように、[ファイル]−[新規作成]−[アプリケーション]で新しいアプリケーションを準備します。フォームにSQLConnectionコンポーネントを配置し、コンポーネントをダブルクリックしてdbExpressの接続の設定をします。ここでもSAMPLEデータベースに接続するように設定しておきます。

 次に、SQLClientDataSetをフォームに配置してDBConnectionプロパティを「SQLConnection1」に設定し、Connectedプロパティを「true」に設定します。[Data Access]タブからDataSourceをフォームに配置し、DataSetプロパティを「SQLClientDataSet1」、Activeプロパティを「true」にします。[Data Controls]タブからDBGridを配置してDataSourceプロパティを「DataSource1」とし、[Standard]タブからButtonを配置してCaptionプロパティを「O.K.」に変更し、大きさや配置を画面5のように調整します。

画面5 テーブルデータの表示

 ここで一度実行してみましょう。

 データベースへのログインプロンプトが表示されるので、パスワードを入力します。すると、画面5のようにDBGridにEMPLOYEEテーブルのデータが表示されます。

 DBGridのデータは編集可能になっているので、試しに変更してみてください。しかし、アプリケーションを再実行してみると変更が反映されていないことに気付くはずです。これは、クライアントデータセットがメモリ内に保持するデータはアプリケーションの終了とともに消えてしまうからです。

 そこで、アプリケーションを終了する前にApplyUpdatesメソッドを実行し、更新内容をデータベースに反映させる処理を加えます。[O.K.]ボタンをダブルクリックして、イベントを記述します()。

procedure TForm1.Button1Click(Sender: TObject);
begin
        SQLClientDataSet1.ApplyUpdates(0); 
end;

 アプリケーションを実行し、データを変更して[O.K.]ボタンをクリックします。アプリケーションを再実行すると、今度は変更が反映されていることが分かるでしょう。

 クライアントデータセットは、DBGridなどを使ってデータを容易に変更できます。ただし、アプリケーションがデータをメモリ内に保持するため、元のデータとの不整合が起こる可能性が高くなります。Webアプリケーションなどで使用する場合は注意が必要です。

2/4

Index
Kylix 3とDB2で作るWebサービス・アプリケーション
 第2回 Kylixからデータベースを操作してみよう
  Page 1
dbExpressを使ったデータベース・プログラミング
  Page 2
データ操作プログラミング手法
 単方向データセットによるデータ操作
 クライアントデータセットによるデータ操作
  Page 3
Web-DBアプリケーション(DSO)の作成
 プロジェクトの準備
 コンポーネントの配置と設定
 プロジェクトのコンパイル
Apacheの設定とアプリケーションの実行
 Apache 1.3のコンパイル
 apachectl、httpd.confの編集
 アプリケーションの実行
  Page 4
DSOアプリケーションのベンチマーク

連載 Kylix 3とDB2で作るWebサービス・アプリ


 Linux Squareフォーラム プログラミング関連記事
特集:オブジェクト指向に生まれ変わるPHP5[前編]
現在開発中のPHP5は、オブジェクト指向機能が大幅に強化される。次世代PHPはどのような言語になるのか?
特集:Windows開発者に贈る Kylixの全貌
注目の開発環境「Borland Kylix」がいよいよ見えてきた。ここに、英語版の発売を目前に控えたKylixの機能やアーキテクチャを紹介しよう
特集:Kylixプログラミング作法
GUIの構築やコンポーネントとコードの関係、 Object Pascalの仕様など。 これらの点を、実際に日本語ベータ版でプログラミングしながら分かりやすく解説
連載:PHP4で作るWeb-DBシステム(全5回)
PHPはWebサーバとデータベースを結びつけるものだ。そのためPHPでの開発を開始するには、OS、データベース、Webサーバ、そしてPHPと、多くのソフトウェアのインストールを行う必要がある
連載:ステップ・バイ・ステップ・シェルスクリプト(全7回)
Linuxの中でシェルスクリプトはネットワークの設定、デーモンの起動など重要な役割を果たしている。この連載では、シェルスクリプトで実用的なプログラムを組むことを目標にして、シェルの基本的な知識を説明する
連載:Kylix 3とDB2で作るWebサービス・アプリ(全5回)
Kylix 3とDB2 V8.1を使って、Webサービス・アプリを作ってみよう。トライアル版も用意されているので、実際に試しながら読んでほしい

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


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

注目のテーマ

Linux & OSS 記事ランキング

本日 月間