データベースにつないで、クエリを使ってテーブルの削除・更新・追加・検索の命令文の書き方を教えていただけないでしょうか?環境はDelphi4です。
接続先のデーターベースは何でしょうか?
Delphi4のバージョンにより、少し方法が違います。
delphi4のservice pack 3 そして、データベースはoracle 8i です。 よろしくお願いします。
まず、BDEAdministratorでOracleに対するAliasを作ってください。
BDEはバージョンが5.2で止まっていますが、最新のものを使ってください。
Oracle8.0.5まで対応しています。
Delphi4がEnterPriseの場合ならば、ConfigrationのDriversに
Nativeと表示があります。
この中にOracleが有りますので、選ぶと右側に内容が表示されます。
Oracle8を使うのなら、この中のDLL32をドロップダウンで
SQLORA8.DLLを選択してください。
VenderInitもOCI.DLLに変更してください。
DataBaseのタブを開いて、メニューの[Object][New]で
NewDatabaseAliasのダイアログが出ます。
ここでドロップダウンから[Oracle]を選びます。
右側に設定が表示され、ServerName、UserName等の設定をしてください。
作られるAliasは多分Oracel1の様な名前になっていますので、
適当に変更してください。
ここで接続できればこの設定は終わりです。
保存して終了してください。
Delphi側からは、フォームかデーターモジュールにVCLのTDatabaseを配置して、Aliasを設定してConnectedをTrueにしてください。接続できれば、OK
次に、SQLを使う場合はTQueryを配置して、DatabaseNameにTDatabaseの名前を設定します。SQLビルダを使えば、有る程度のSQL文を作成してくれます。
TQueryのActiveをTrueにしてエラーが出なければ接続はOKです。
この程度で後は判りますね。
どうもありがとうございます。SQLビルダはどうやって利用するのでしょうか? また、テーブルの削除・更新・追加・検索(複数の条件下で)の命令文の書き方をお伺いしましたが、それぞれの処理(削除DELETE・更新UPDATE・追加APPEND・検索SELECT)について、実際の例を記述していただきますと幸いです。現段階では、PARAMSを利用して、SELECT文で1つの条件だけでソートすることができるようになりましたSELECT * FROM TABLE WHERE AA =: VALUE。複数はまだです。初心者なので、わからないことが多々ありますが、よろしくお願いします。
選択はうまくいったということは、接続はOKですね。
SQLビルダは、TQueryのAliasを設定後に、TQueryの上にマウスを置き、
右ボタンで出るサブメニューからSQLビルダを選びます。
テーブルドロップダウンから必要なテーブルを選択します。
複数のテーブルの場合は一つずつ選べば、テーブル名と項目を表示します。
テーブル名のAliasを設定する場合は、テーブル名状で右クリック->
テーブルAliasの設定で変更します。そのままでもかまいません。
必要な項目にチェックを付けます。
複数のテーブルの場合は、結合項目をドラッグドロップすれば結合線が
出来、結合されます。
SQL文は、基本的には
選択文
Select 項目名1,項目名2,項目名3 /*選択項目指定*/
From テーブル名 アリアス名 /*テーブル指定*/
where 項目名1 = Value4 and 項目名2 = Value5 /*条件指定*/
Order by 項目名2,項目名3 /* ソート指定 */
更新文
Update テーブル名 set
項目名1=Value1,
項目名2=Value2,
項目名3=Value3
where 項目名1 = Value4 and 項目名2 = Value5 /*条件指定*/
削除文
Delete テーブル名
where 項目名1 = "2" and 項目名2 = 5 /*条件指定*/
追加文
insert into テーブル名
(項目名1,項目名2,項目名3)
values
(Value1, Value2, Value3)
になります。
選択文は、Active=True か Openで実行します。
それ以外は、ExecSQLで実行します。
ParamsはこのValueに対して設定します。
しかし、実行前にSQLを直接設定することも出来ます。
with Query1 do begin
Close;
with SQL do
begin
Clear;
Add('Select 項目名1,項目名2,項目名3 /*選択項目指定*/');
Add('From テーブル名 アリアス名 /*テーブル指定*/');
Add('where 項目名1 = Value4 and 項目名2 = Value5 /*条件指定*/');
Add('Order by 項目名2,項目名3 /* ソート指定 */');
end;
Active := True;
end;
詳しい説明ありがとうございます。いつも小さなミスでエラーが生じてしまうので、それぞれの構文の書き方の確認なんですが、
(データベース上のテーブル名:a ,項目1: aID(NUMBER型), 項目2:aNAME(文字型), 項目3:aADDRESS(文字型) /// フォーム上のteditの名前をそれぞれedit_ID, edit_NAME, edit_ADDRESSとしたとき )
SELECT文の場合
procedure
var
ival : integer;
sval1 : string;
sval2 : string;
begin
ival := StrToInt(edit_ID.Text);
sval1 := edit_NAME;
sval2 := edit_ADDRESS;
with query1 do
begin
close;
with sql do
begin
clear;
add('select * from a where aID = :value1 and
aNAME = :value2 and aADDRESS = :value3');
prepare;
params[0].AsInteger := ival;
params[1].AsString := sval1;
params[2].AsString := sval2;
end;
open;
end
end;
UPDATE文の場合
close;
with sql do
begin
add('update a set aID = :value1, aNAME =:value2, aADDRESS = :value
where aID = :value1')
prepare;
params 後はselect文の時のようにする)
DELETE文の場合
close;
with sql do
begin
add('delete from a where aID = :value1');
prepare;
params 後はselect文の時のようにする)
insert文の場合
close;
with sql do
begin
add('insert into a (aID, aNAME, aADDRESS) values (value1, value2, value3);
あとはselect文と同じ
・書き方は上記で大丈夫でしょうか?
・value1の前には、コロンが必要ですか?
・where条件が長いと文が横に長くなってしまうので、行を変えたいのですが、そのまま行をかえて実行しようとするとコンパイルエラーが出てしまいます。行を変える場合には、&_ や + のような記号が必要ですか?
・aNAMEやaADDRESSのような初めからstring型でedit.TEXTの形式を変える
必要のないものは、上記のような書き方で大丈夫でしょうか?
・最後にSELECT文で、 検索条件を緩めるためにlike文等を使いたいと思っているのですが、書き方がいまいちわかりません。恐縮ですが、教えていただけないでしょうか?
わからないことだらけで、いくつも質問をしてしまってすみません。よろしくお願いいたします。
書き方は、これでも構いません。
ただ、Add()でSQLを設定しているところで、1行で書くようにすると、
改行で書いた場合にスペースか改行を入れ忘れる事があるので、注意しましょう。
add('select * from a where aID = :value1 and ' +
'aNAME = :value2 and aADDRESS = :value3');
と書いた場合は、SQLに
select * from a where aID = :value1 and aNAME = :value2 and aADDRESS = :value3
と1行に設定されます。
add('select * ');
add(' from a');
add('where aID = :value1');
add(' and aNAME = :value2');
add(' and aADDRESS = :value3');
と書けば、
select *
from a
where aID = :value1
and aNAME = :value2
and aADDRESS = :value3
の様に改行が入って、複数行に設定されます。
エラーが出た時は、何行目かというのが出て判りやすくなります。
Parametaを設定する場合は、変数名の前にコロンを入れます。
プログラム中で行を変える場合は、文字列を分けるので「+」を使用します。
TQueryのプロパティの中でSQLにプログラム以前にSQL文を設定していて、
プログラム中ではSQLの設定をせずに、
params[0].AsInteger := ival;
params[1].AsString := sval1;
params[2].AsString := sval2;
だけを各方法もあります。これは判りやすく
ParamByName('Value1').AsInteger := ival;
という風に変数名で参照する方法も有ります。
この場合は、変数名の型をプロパティで設定します。
ただ、変数の型には注意しましょう。
Like文はデーターベースにより使い方が違いますが、SQL文では
where aNAME Like 'a%'
ですから、プログラム上では
Add('where aNAME Like ''a%''');
の様にします。
このあたりは、OracleのSQLですから、
http://www.iceprobe.net/database/oracle/oraorasql/sql_command_like.php
あたりを参照した方が詳しく調べられます。
DelphiはOracleなどのデーターベース機能をUIとして使う道具を作るものですので、
どのように組み合わさっているのを考えながらProgramしましょう。
うまく実行することができました。丁寧に説明していただき、本当にありがとうございました。
HOtaさん、詳しい情報ありがとうございます。
テーブルのIDは文字型です。また、SELECT TRUNC文の結果は、まったくかんけいない数字がROWNUMで指定した数だけ表示されます(ROWNUM<=3でしたら、8,7,7など)。
また、Hotaさんに教えていただいたことを試したのですが、普通のクエリでupdateする処理については、実行時にSQLコマンドエラーになってしまいます。WHERE文のところ
がうまく機能していないのではないかとおもいます。
UPDATESQLについては、私はテーブルTTABLEをつかわず、クエリのみで処理していたのですが、新しくTTABLEを設置し、UPDATESQLを使おうとしたのですが、オプションのところでテーブル名が選択できず、またDATASOURCEからもクエリのみしか指定できませんでした。無理矢理プログラムを書いてみたのですが、認識されずコンパイルエラーになってしまいました。何度も申し訳ないのですが、アドバイスいただけないでしょうか?
ツイート | ![]() |