|
データベース【TIBQueryでSQLを使おう(2)】 |
テーブルを作成し、テーブルにデータを登録する事は出来ましたので次に、データの内容を編集する事について考えます。
プロジェクト「d005」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「d005」というフォルダを作成し、前回の「d004」からファイルをがさっとコピーしてきます。Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
タイトル | d005−データベース作成 |
[ディレクトリ/条件]頁
パス及びディレクトリ | C:\DelphiProgram\db\d005 |
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\db\d005」の中に「d005.dpr」として保存
メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。
メニュー「プロジェクト」→「d005を再構築」を実行し、エクスプローラ等で不要になった「C:\DelphiProgram\db\d005」内にある「d004.〜」のファイルを消しておきます。
それではテーブル内のデータの編集を出来るようにしてみます。Buttonを1つ追加し、画面レイアウトは下記のようにしてみました。
編集を行う場合は、どのデータの、どのフィールド内容を、どのように変更するのか、という事になりますが、どのデータを編集するのかを指定しない場合は、全てのデータを編集する、という事になります。
データを追加する際のSQL文は
INSERT INTO テーブル名 (フィールド名のリスト) VALUES (値のリスト); |
ですが、データを編集する際のSQL文は下記のようになります。
UPDATE テーブル名 SET 代入式のリスト; |
UPDATE テーブル名 SET 代入式のリスト WHERE 条件式; |
前者が全てのデータを一括編集する場合で、後者は条件式を指定する事によって、その条件式に合うデータだけを編集する場合です。代入式は「フィールド名=値」又は「フィールド名=式」となります。条件式は「フィールド名 演算子 値」等のようになります。
例えば
UPDATE TEST1 SET MOJIDATA='ABCDE'; |
とするとテーブル「TEST1」内の全てのデータのMOJIDATAフィールドの内容が「ABCDE」に編集されます。これはよっぽどの事が無い限り使用しないでしょう。通常は条件式を指定して、どのデータを編集するのかを指定します。
UPDATE TEST1 SET MOJIDATA='ABCDE' WHERE N=1; |
とすれば、Nフィールドの値が「1」のデータのMOJIDATAを「ABCDE」に変更します。
UPDATE TEST1 SET MOJIDATA='ABCDE' WHERE N>100; |
とすると、Nフィールドの値が「100」よりも大きいデータのMOJIDATAを「ABCDE」に変更します。
UPDATE TEST1 SET MOJIDATA='ABCDE' WHERE (N>=10) AND (N<=20); |
とすると、Nフィールドの値が「10」〜「20」のデータのMOJIDATAを「ABCDE」に変更します。
使える条件式は以下のようになっています。
等号不等号 |
< > <= >= = <>
値が数値型以外は ''で括る |
BETWEEN <A> AND <B> | 値が<A>〜<B>の間のもの |
IN (<A>,<B>,<C>,〜) | 値が<A>,<B>,<C>,〜のどれかの時 |
LIKE '〜' |
文字列のパターンマッチング
%:ワイルドカード
'%ABC' :〜〜ABC の値のもの
'ABC%' :ABC〜〜 の値のもの
'%ABC%':〜ABC〜 の値のもの |
NOT |
否定;〜でない 他の演算子と合わせる
NOT A=B:A=Bではないもの |
IS NULL |
値が入って無い 値がヌル値であるもの
0 や 空白文字 は対象外 |
AND | 且つ |
OR | 又は |
括弧() | 複数条件 |
という訳で、どのデータを編集するのかを指示するために、レコード番号がありそうなところで敢えて「N」フィールド名を付けるようにする訳です。そうすれば、「N」の値が「1」のものを編集する、という事が可能となります。仮にこれがないとすると、「MOJIDATA」の値が「あいうえお」のものを、というような書き方をしないといけなくなり、SQL文は長くなってしまいますし、同じ内容のデータが全て編集されてしまう事となってしまいます。
それでは追加した Button5をダブルクリックしてボタンクリック時のイベントハンドラを作成します。内容は SQL文の箇所以外は[登録]の場合と同じです。
// [編集]
procedure TForm1.Button5Click(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('UPDATE TEST1 SET ');
Add(' MOJIDATA=' + p2);
Add(' WHERE N=' + p1 + ';');
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; |
次に、テーブル内のデータの削除を出来るようにしてみます。Buttonを1つ追加し、画面レイアウトは下記のようにしてみました。
削除を行う場合は、どのデータを削除するのか、という事になりますが、どのデータを削除するのかを指定しない場合は、全てのデータを削除する、という事になります。データを削除する際のSQL文は下記のようになります。
DELETE FROM テーブル名 WHERE 条件式; |
前者が全てのデータを削除する場合で、後者は条件式を指定する事によって、その条件式に合うデータだけを削除する場合です。条件式はデータ編集「UPDATE」の場合と同じです。
それでは追加した Button6をダブルクリックしてボタンクリック時のイベントハンドラを作成します。Nの内容で指示した1つのデータだけを削除するようにします。Nの値は、テーブル作成時に「NOT NULL」によって「NULL値ではない」事が保証されていますし、「UNIQUE」によって同じ内容のものは無いという事も保証されています。
// [削除]
procedure TForm1.Button6Click(Sender: TObject);
var
i,j : integer ;
p1 : 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);
if MessageDlg('データ N='+p1+' を削除します。よろしいですか?',
mtConfirmation, [mbYes, mbNo], 0) = mrNo then begin
Edit3.SetFocus;
exit ;
end;
try
IBTransaction1.Active := False ;
IBTransaction1.StartTransaction ;
IBQuery1.Close;
IBQuery1.ParamCheck := False ;
with IBQuery1.SQL do begin
Clear ;
Add('DELETE FROM TEST1');
Add(' WHERE N=' + p1 + ';');
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; |
なお、編集及び削除で、存在しないデータを指示した場合でも例外(エラー)は発生しませんので「失敗」とは表示されません。
|
|
バッチファイル
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
|