|
データベース【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;
(・・・後略・・・) |
データ型(データタイプ)は色々とあります。例えば
SMALLINT | 16bit | 符号付き整数(short) | -32,768〜32,767 |
INTEGER | 32bit | 符号付き整数(long) |
-2,147,483,648
〜2,147,483,647 |
FLOAT | 32bit |
IEEE 単精度浮動小数点
有効桁数7桁 |
1.175 × 10^-38
〜3.402 × 10^38 |
DOUBLE PRECISION | 64bit |
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 |
DATE | 32bit | 日付 |
西暦100年1月1日
〜32768年2月29日 |
TIME | 32bit | 時刻 |
0:00 AM
〜23:59.9999 PM |
TIMESTAMP | 64bit | 日付+時刻 | 同上 |
CHAR(n) | n 文字 |
固定長文字データ型
n:正確な格納文字数 | 1〜32,767バイト |
VARCHAR(n) | n 文字 |
可変長文字データ型
n:最大文字数 | 1〜32,765バイト |
BOOLEAN | 16ビット |
真偽値 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文は
のようになります。データがあってもあっさり消されますので、テーブルを消す場合は注意して下さい。必要なデータを消してしまわないよう注意が必要です。
それでは、画面レイアウトを下記のようにして、テーブルを削除出来るようにしてみます。
// [テーブル削除]
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
|