AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
データベース【TIBQueryでSQLを使おう(1)】
さて今回から、TIBTableではなく、TIBQueryを使い、SQLを使う事によってデータベースを作成していく事について考えていきます。
TIBTableでもこれまでに書いたようにデータベースを作ってテーブルを作ってアクセスする事は可能です。けれどもその大きな違いとなって出てくるのはおそらく、データの検索と、データの並び替え、でしょう。
TIBTableでデータの検索をする場合はおそらく、全データを対象に、最初から最後までを読み込み、その過程で、あるフィールドの内容が条件に満足しているかどうかを判定させて、という事になるでしょう。データの並び替えについては、データを全部メモリ等に読み込んでしまってから、あるフィールドの内容を見て、バブルソート、クイックソート等によって並び替える事になるでしょう。インデックス・キー等もありますが単純なケースにしか使えない場合や制約もありますから使いにくい事も多いです。
ところが、SQLを使う事によって、検索はある条件のデータだけを参照する、という事が可能です。並び替えも、あるフィールド内容について並び替えた状態で参照する、という事が可能です。ある程度の所までデータベースが自動的にやってくれる訳です。そのため、プログラミングの負担もかなり減らす事が出来ます。
 
という訳でまずは、SQLでのデータベースの作成方法から見ていく事にします。
 
プロジェクト「d004」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「d004」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
d004−データベース作成
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\db\d004

メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\db\d004」の中に「Unit1.pas」を保存
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\db\d004」の中に「d004.dpr」として保存

Form1の画面は、大きさを扱いやすいよう小さくし、オブジェクトインスペクタで Form1 のプロパティを設定します。
Captionデータベース作成タイトルバーに表示されます
ColorclWhite画面色 御自由にどうぞ
Font内
 Name
MS ゴシック プロポーショナルフォントは
文字配置調整が微妙なので
Font内
 Size
10小さいと少し見難い為
ScaledFalse 動作環境によっての文字の
大きさ変動を少し抑えられる

メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。

 
フォーム上に、[InterBase]内の「IBDatabase」「IBTransaction」「IBQuery」を配置します。オブジェクトインスペクタでそれぞれプロパティを指定します。
「IBDatabase1」
DefaultTransactionIBTransaction1
LoginPromptFalse

「IBTransaction1」
DefaultDatabaseIBDatabase1

「IBQuery1」
DatabaseIBDatabase1
TransactionIBTransaction1

次に前回同様、2つのLabelと2つのEdit、2つのButtonを配置してプロパティを指定します。画面レイアウトは下記のような感じです。

 
それでは、データベース「TEST1.FDB」を作成する方法です。これは前回同様に、プログラム起動時に行う事とします。Form1のOnShowイベントにコーディングを行います。
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
 // 起動時にデータベースを作成します
 IBDataBase1.DatabaseName := Edit1.Text + Edit2.Text + 'TEST1.FDB' ;
 IBDatabase1.Params.Clear ;
 IBDatabase1.Params.Add('USER "SYSDBA"');
 IBDatabase1.Params.Add('PASSWORD "masterkey"');
 IBDatabase1.Params.Add('PAGE_SIZE 4096');
 try
  IBDataBase1.CreateDatabase;
 except
  // 既に作成済み
 end;
end;
次に、[DB接続]ボタンをクリックしたらデータベースに接続するようにしますので、ボタンをダブルクリックして、クリックイベント時のコーディングを行います。
// [DB接続]
procedure TForm1.Button1Click(Sender: TObject);
begin
 // データベース接続
 IBDataBase1.DatabaseName := Edit1.Text + Edit2.Text + 'TEST1.FDB' ;
 IBDataBase1.Connected := False ;
 IBDatabase1.Params.Clear ;
 IBDatabase1.Params.Add('USER_NAME=SYSDBA');
 IBDatabase1.Params.Add('PASSWORD=masterkey');
 try
  IBDatabase1.Connected := True ;
 except
  Button2Click(Sender) ;  // エラーしたら切断
 end;
end;
次に、[DB切断]ボタンをクリックしたらデータベースから切断するようにしますので、ボタンをダブルクリックして、クリックイベント時のコーディングを行います。
// [DB切断]
procedure TForm1.Button2Click(Sender: TObject);
begin
 IBQuery1.Active := False ;
 IBTransaction1.Active := False ;
 IBDatabase1.Connected := False ;
end;
プログラム終了時にも切断処理を入れておくことにします。Form1のOnCloseイベントにコーディングを行います。
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Button2Click(Sender);  // DB切断
end;
 

 
準備が出来たところで、次にテーブル「TEST1」の作成を行う事を考えます。テーブル内容は前回同様、
N整数
MOJIDATA文字(半角20文字)
とします。上記の[DB接続]時にテーブル「TEST1」を作成するようにしてみます。
// [DB接続]
procedure TForm1.Button1Click(Sender: TObject);
(・・・中略・・・)
  Button2Click(Sender) ;  // エラーしたら切断
  exit ;
 end;
 // テーブル作成
 try
  IBTransaction1.Active := False ;
  IBTransaction1.StartTransaction ;
  IBQuery1.Close;
  IBQuery1.ParamCheck := False ;
  with IBQuery1.SQL do begin
   Clear ;
   Add('CREATE TABLE TEST1 (' );
   Add(' N INTEGER NOT NULL UNIQUE,');
   Add(' MOJIDATA VARCHAR(20)');
   Add(' );');
  end;
  if not(IBQuery1.Prepared) then IBQuery1.Prepare;
  IBQuery1.ExecSQL;
  IBTransaction1.Commit;
 except
  IBTransaction1.Rollback ;
 end;
 IBQuery1.Active := False ;
 IBTransaction1.Active := False ;
end;
トランザクションの開始〜終了などが入っていますが、そういうのは「おまじない」と思って下さい。重要なのは、SQLプロパティ内に
CREATE TABLE TEST1 (
 N INTEGER NOT NULL UNIQUE,
 MOJIDATA VARCHAR(20)
 );
という内容を入れて「ExecSQL」で実行しているという所です。この「CREATE TABE」文を使ってテーブルを作成する事が出来ます。次の「TEST1」がテーブル名でその後のフィールド内容を「(○,・・・,○)」という具合に書いて、最後に「;」を付けます。1行で書いてもいいのですがややこしくなるのでこのように適当に改行したりします。
フィールド内容は、フィールド名、型、となります。INTEGERは整数、VARCHAR(20)は半角20文字の文字列です。「NOT NULL」の指定は「NULL値はダメ」って制約です。NULL値というのは、値を指定しない状態を意味します。つまり、絶対に値を指定して下さいという意味です。次の「UNIQUE」は「固有である事」つまり、同じ値は使えません、という意味になります。もしもデータ登録・更新時に使えば例外(エラー)となります。
 
次に、テーブルを作成したのだからデータを登録出来るようにします。画面上に2つの Label、2つのEdit、2つのButton、1つのMemoを配置して以下のような画面にします。

[登録]ボタンをクリックしたらテーブルにデータ登録するようにしますので、ボタンをダブルクリックして、クリックイベント時のコーディングを行います。
// [登録]
procedure TForm1.Button3Click(Sender: TObject);
var
 i,j : integer ;
 p1,p2 : string ;
begin
 if not(IBDatabase1.Connected) then exit ;
 i := 0;
 if (Edit3.Text <> '') then begin
  Val(Edit3.Text,i,j);
  if (j <> 0) then i := 0;
 end;
 p1 := IntToStr(i);
 p2 := Edit4.Text ;
 if (AnsiPos('''',p2) > 0)or(AnsiPos('"',p2) > 0) then begin
  ShowMessage('MOJIDATAに「''」「"」は使わないでください');
  Edit4.SetFocus;
  exit ;
 end;
 if (p2 = '') then
  p2 := 'NULL'
 else
  p2 := '''' + p2 + '''' ;
 
 try
  IBTransaction1.Active := False ;
  IBTransaction1.StartTransaction ;
  IBQuery1.Close;
  IBQuery1.ParamCheck := False ;
  with IBQuery1.SQL do begin
   Clear ;
   Add('INSERT INTO TEST1 (');
   Add(' N, MOJIDATA)');
   Add('VALUES (');
   Add(' ' + p1 + ',');
   Add(' ' + p2 + ');');
  end;
  if not (IBQuery1.Prepared) then IBQuery1.Prepare;
  IBQuery1.ExecSQL;
  IBTransaction1.Commit;
  ShowMessage('登録OK');
 except
  IBTransaction1.Rollback ;
  ShowMessage('登録失敗');
 end;
 IBQuery1.Active := False ;
 IBTransaction1.Active := False ;
end;
これも入力内容のチェックやトランザクションの開始〜終了などが入っていますが、そういうのは「おまじない」と思って下さい。重要なのは、SQLプロパティ内に
INSERT INTO TEST1 ('
 N, MOJIDATA)
VALUES (
 〜〜,
 〜〜);
という内容を入れて「ExecSQL」で実行しているという所です。この「INSERT INTO テーブル名」がテーブル名にデータを登録するという意味で、次にフィールド名のリストを括弧で囲んで「,」で区切って書いて、次に、登録する値(内容)のリストを同様に書いて最後は「;」でしめて、ExecSQLメソッドで実行します。
整数のところは整数で入れる事。文字は「'」で囲って入れますが、文字内容が未入力状態の場合「''」と指定する事は出来ず「NULL」と指定する必要があります。
 
[表示]ボタンをクリックしたらMemoに登録されたデータ一覧を表示するようにしますので、ボタンをダブルクリックして、クリックイベント時のコーディングを行います。
// [表示]
procedure TForm1.Button4Click(Sender: TObject);
var
 s : string ;
begin
 if not(IBDatabase1.Connected) then exit ;
 Memo1.Lines.Clear ;
 IBQuery1.Active := False ;
 IBTransaction1.Active := False ;
 IBQuery1.ParamCheck := True ;
 with IBQuery1.SQL do begin
  Clear ;
  Add('SELECT * FROM TEST1;') ;
 end;
 //
 try
  IBQuery1.Open ;
  IBQuery1.First ;
  while not(IBQuery1.Eof) do begin
   s := IBQuery1.Fields[0].AsString + ','
     + IBQuery1.Fields[1].AsString;
   Memo1.Lines.Add(s);
   IBQuery1.Next ;
  end;
 except
  ;
 end;
 IBQuery1.Active := False ;
end;
若干の違いがありますが幾つかの「おまじない」はありますが重要なのは、SQLプロパティ内に
SELECT * FROM TEST1;
という内容を入れて「IBQuery1.Open」で実行し、テーブル内容を開こうとしている所です。SELECT文はデータ参照しているだけですのでトランザクション開始〜終了で囲むという事はありません。
テーブル「TEST1」から項目内容「*」(全て)を選択して、あとは、そこから得られるデータ内容を最初から最後まで読み込み表示するようにしているだけです。
 
なお、
「IBQuery1.Open」と「IBQuery1.Active := True」、
「IBQuery1.Close」と「IBQuery1.Active := False」、
は同じ意味です。
 
 
 


 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
シェアウェア
Script!World
データベース
 A B C D
 E F G H
 I J K L
 M N O P
 Q R S T
 U V W X
 Y Z
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.