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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
データベース【TIBQueryでSQLを使おう(3)】
テーブルを作成し、テーブルへのデータの登録・編集・削除を行う方法について述べました。データベースは複数のテーブルを持つ事が出来ますが、これまでは1つしか作成していませんので2つ目のテーブルを作成します。
 
プロジェクト「d006」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「d006」というフォルダを作成し、前回の「d005」からファイルを全部コピーしてきます。Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
d006−データベース作成
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\db\d006

メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\db\d006」の中に「d006.dpr」として保存
メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。
 
メニュー「プロジェクト」→「d006を再構築」を実行し、エクスプローラ等で不要になった「C:\DelphiProgram\db\d006」内にある「d005.〜」のファイルを消しておきます。

 
前回は「TEST1」というテーブルを作成していましたので今回は「TEST2」というテーブルを作成します。同じフィールド内容だと面白くありませんので、単精度実数型の「VAL1」と倍精度実数型の「VAL2」を追加してみます。画面レイアウトは下記のようにしてみました。Panel1を配置した上に各ボタン・入力欄を配置し、Panel1のAlignプロパティを「alTop」に、Memo1のAlignプロパティを「alClient」にしています。こうしておけば画面をリサイズした場合に画面レイアウト的に都合がよくなります(画面を小さくすると上部の一部が欠けてしまいますが)。

テーブル「TEST2」の内容は下記のようにします。
N整数
VAL1単精度実数
VAL2倍精度実数
MOJI文字(半角40文字)

上記に合わせてプログラムを変更します。まずはテーブル作成の箇所です。
procedure TForm1.Button1Click(Sender: TObject);
(・・・中略・・・)
 // テーブル作成
 try
  IBTransaction1.Active := False ;
  IBTransaction1.StartTransaction ;
  IBQuery1.Close;
  IBQuery1.ParamCheck := False ;
  with IBQuery1.SQL do begin
   Clear ;
   Add('CREATE TABLE TEST2 (' );
   Add(' N INTEGER NOT NULL UNIQUE,');
   Add(' VAL1 FLOAT,');
   Add(' VAL2 DOUBLE PRECISION,');
   Add(' MOJI VARCHAR(40)');
   Add(' );');
  end;
(・・・後略・・・)
データ型(データタイプ)は色々とあります。例えば
SMALLINT16bit符号付き整数(short)-32,768〜32,767
INTEGER32bit符号付き整数(long) -2,147,483,648
〜2,147,483,647
FLOAT32bit IEEE 単精度浮動小数点
 有効桁数7桁
1.175 × 10^-38
〜3.402 × 10^38
DOUBLE PRECISION64bit IEEE 倍精度浮動小数点
 有効桁数15桁
2.225 × 10^-308
〜1.797 × 10^308
NUMERIC(p[,s])
DECIMAL(p[,s])
16〜
64bit
固定小数点
p:有効桁数 
s:小数点以下の桁数
p:1〜18
s:0〜p
DATE32bit日付 西暦100年1月1日
〜32768年2月29日
TIME32bit時刻 0:00 AM
〜23:59.9999 PM
TIMESTAMP64bit日付+時刻同上
CHAR(n)n 文字 固定長文字データ型
n:正確な格納文字数
1〜32,767バイト
VARCHAR(n)n 文字 可変長文字データ型
n:最大文字数
1〜32,765バイト
BOOLEAN16ビット 真偽値 TRUE,FALSE
及び、UNKNOWN
等があります(上記以外にも色々あります)。データ型は使用するデータベースによって異なる場合が多いですし、扱いが難しいものもあります。本サイトでは基本的に「SMALLINT」「INTEGER」「FLOAT」「DOUBLE PRECISION」「VARCHAR」のみ使用します。
 
文字から整数・単精度実数・倍精度実数への変換は何度も書くと手間なのでそれぞれ関数 「SInt()」「SFlo()」「SDbl()」を作成しておきます。
(・・・)
type
 TForm1 = class(TForm)
  Memo1: TMemo;
  Panel1: TPanel;
  (・・・中略・・・)
 private
  { Private 宣言 }
  function SInt(s:string):integer ;
  function SFlo(s:string):single ;
  function SDbl(s:string):double ;
 public
(・・・中略・・・)
implementation
 
{$R *.dfm}
 
// 文字列→整数
function TForm1.SInt(s:string):integer ;
var
 a,i : integer ;
begin
 if (s <> '') then begin
  Val(s,a,i);
  if (i <> 0) then a := 0;
 end
 else
  a := 0;
 Result := a;
end;
 
// 文字列→実数(float(single))
function TForm1.SFlo(s:string):single ;
var
 a : single ;
 i : integer ;
begin
 if (s <> '') then begin
  Val(s,a,i);
  if (i <> 0) then a := 0.0;
 end
 else
  a := 0.0;
 Result := a;
end;
 
// 文字列→実数(double)
function TForm1.SDbl(s:string):double ;
var
 a : double ;
 i : integer ;
begin
 if (s <> '') then begin
  Val(s,a,i);
  if (i <> 0) then a := 0.0;
 end
 else
  a := 0.0;
 Result := a;
end;
(・・・)
登録部分のプログラムです。
// [登録]
procedure TForm1.Button3Click(Sender: TObject);
var
 i : integer ;
 a : single ;
 b : double ;
 p1,p2,p3,p4 : string ;
begin
 if not(IBDatabase1.Connected) then exit ;
 i := SInt(Edit3.Text);
 a := SFlo(Edit4.Text);
 b := SDbl(Edit5.Text);
 p1 := IntToStr(i);
 p2 := FloatToStr(a);
 p3 := FloatToStr(b);
 p4 := Edit6.Text ;
 if (AnsiPos('''',p4) > 0)or(AnsiPos('"',p4) > 0) then begin
  ShowMessage('MOJIに「''」「"」は使わないでください');
  Edit6.SetFocus;
  exit ;
 end;
 if (p4 = '') then
  p4 := 'NULL'
 else
  p4 := '''' + p4 + '''' ;
 
 try
  IBTransaction1.Active := False ;
  IBTransaction1.StartTransaction ;
  IBQuery1.Close;
  IBQuery1.ParamCheck := False ;
  with IBQuery1.SQL do begin
   Clear ;
   Add('INSERT INTO TEST2 (');
   Add(' N, VAL1, VAL2, MOJI)');
   Add('VALUES (');
   Add(' ' + p1 + ',');
   Add(' ' + p2 + ',');
   Add(' ' + p3 + ',');
   Add(' ' + p4 + ');');
  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;
同様に、表示、編集、削除の箇所も修正します。
 

これでテーブルが2つになりました。
テーブルが更にどんどん増えていくと、データベース内に、現在存在するテーブルがどれくらいあるのかを知りたい場合が出てきます。その場合には、IBDatabaseコンポーネントの GetTableNames メソッドを利用すると良いでしょう。それでは画面レイアウトを下記のようにしてみます。

テーブル一覧は[DB接続]を行った時に内容を更新するようにします。下記のようにプログラムします。
// [DB接続]
procedure TForm1.Button1Click(Sender: TObject);
(・・・中略・・・)
 // テーブル一覧取得
 ComboBox1.Items.Clear ;
 IBDatabase1.GetTableNames(ComboBox1.Items);
end;
実行すると ComboBoxの右端の[▼]で「TEST1」「TEST2」が選択出来るのが分かります。ついでに、[表示]を行う際には、ここで選択したテーブル内容を表示するようにします。
// [表示]
procedure TForm1.Button4Click(Sender: TObject);
var
 t,s : string ;
 i : integer ;
begin
 if not(IBDatabase1.Connected) then exit ;
 if (ComboBox1.ItemIndex >= 0) then
  t := ComboBox1.Items[ComboBox1.ItemIndex]
 else
  t := 'TEST2';
 Memo1.Lines.Clear ;
 IBQuery1.Active := False ;
 IBTransaction1.Active := False ;
 IBQuery1.ParamCheck := True ;
 with IBQuery1.SQL do begin
  Clear ;
  Add('SELECT * FROM ' + t + ';') ;
 end;
 //
 try
  IBQuery1.Open ;
  IBQuery1.First ;
  while not(IBQuery1.Eof) do begin
   s := '';
   for i:=0 to IBQuery1.FieldCount-1 do
    s := s + IBQuery1.Fields[i].AsString + ',';
   Memo1.Lines.Add(s);
   IBQuery1.Next ;
  end;
 except
  ;
 end;
 IBQuery1.Active := False ;
end;
テーブルによってフィールド内容・フィールド数が異なりますので注意します。SQL「SELECT」文で取得されたフィールド数は、IBQueryの FieldCountプロパティで分かります。
 

テーブルのフィールド内容を編集する際のSQL文は
ALTER TABLE テーブル名 ADD フィールド内容;
のようになりますが、増やす方向に編集する事は出来ますが、減らす方向に編集する事は出来ませんし制約もありますから、色々と編集したい場合には、
 データをテキストファイル等でバックアップ
   ↓
 テーブルを削除
   ↓
 新しいフィールド内容でテーブルを作成
   ↓
 バックアップしたデータを読み込んで登録
 (その際の変換等には注意)
というような手順を踏むと良いかもしれません。
 

それでは次にテーブルの削除についてです。
テーブルを削除する際のSQL文は
DROP TABLE テーブル名;
のようになります。データがあってもあっさり消されますので、テーブルを消す場合は注意して下さい。必要なデータを消してしまわないよう注意が必要です。
それでは、画面レイアウトを下記のようにして、テーブルを削除出来るようにしてみます。

// [テーブル削除]
procedure TForm1.Button7Click(Sender: TObject);
var
 i : integer ;
 t : string ;
begin
 if not(IBDatabase1.Connected) then exit ;
 i := ComboBox1.ItemIndex ;
 if (i = -1) then exit ;
 t := ComboBox1.Items[i] ;
 if MessageDlg('テーブル「'+t+'」を削除します。よろしいですか?',
  mtConfirmation, [mbYes, mbNo], 0) = mrNo then exit ;
 
 try
  IBTransaction1.Active := False ;
  IBTransaction1.StartTransaction ;
  IBQuery1.Close;
  IBQuery1.ParamCheck := False ;
  with IBQuery1.SQL do begin
   Clear ;
   Add('DROP TABLE ' + t + ';');
  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 ;
 // テーブル一覧取得
 ComboBox1.Items.Clear ;
 IBDatabase1.GetTableNames(ComboBox1.Items);
end;
テーブルを消した後にテーブルの[表示][登録][編集][削除]を行うと、テーブルが無いという事で例外(エラー)が発生します。なお[DB切断]をして[DB接続]を行うとテーブルの新規作成を行いますので、テーブルがないという例外は発生しなくなります。
 
 
 


 
バッチファイル
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.