データベース クエリを使った検索・更新・削除・追加

解決


りな  2009-12-24 08:50:30  No: 36538

データベースにつないで、クエリを使ってテーブルの削除・更新・追加・検索の命令文の書き方を教えていただけないでしょうか?環境はDelphi4です。


HOta  2009-12-24 12:28:48  No: 36539

接続先のデーターベースは何でしょうか?
Delphi4のバージョンにより、少し方法が違います。


りな  2009-12-25 07:32:36  No: 36540

delphi4のservice pack 3  そして、データベースはoracle 8i  です。  よろしくお願いします。


HOta  2009-12-25 19:12:19  No: 36541

まず、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です。
この程度で後は判りますね。


りな  2009-12-27 09:32:39  No: 36542

どうもありがとうございます。SQLビルダはどうやって利用するのでしょうか?  また、テーブルの削除・更新・追加・検索(複数の条件下で)の命令文の書き方をお伺いしましたが、それぞれの処理(削除DELETE・更新UPDATE・追加APPEND・検索SELECT)について、実際の例を記述していただきますと幸いです。現段階では、PARAMSを利用して、SELECT文で1つの条件だけでソートすることができるようになりましたSELECT * FROM TABLE WHERE AA =: VALUE。複数はまだです。初心者なので、わからないことが多々ありますが、よろしくお願いします。


HOta  2009-12-27 11:48:52  No: 36543

選択はうまくいったということは、接続は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;


りな  2009-12-27 23:04:52  No: 36544

詳しい説明ありがとうございます。いつも小さなミスでエラーが生じてしまうので、それぞれの構文の書き方の確認なんですが、
(データベース上のテーブル名: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文等を使いたいと思っているのですが、書き方がいまいちわかりません。恐縮ですが、教えていただけないでしょうか?

わからないことだらけで、いくつも質問をしてしまってすみません。よろしくお願いいたします。


HOta  2009-12-28 16:21:28  No: 36545

書き方は、これでも構いません。
ただ、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しましょう。


りな  2009-12-29 15:24:36  No: 36546

うまく実行することができました。丁寧に説明していただき、本当にありがとうございました。


りな  2010-01-13 20:04:29  No: 36547

HOtaさん、詳しい情報ありがとうございます。

テーブルのIDは文字型です。また、SELECT TRUNC文の結果は、まったくかんけいない数字がROWNUMで指定した数だけ表示されます(ROWNUM<=3でしたら、8,7,7など)。

また、Hotaさんに教えていただいたことを試したのですが、普通のクエリでupdateする処理については、実行時にSQLコマンドエラーになってしまいます。WHERE文のところ
がうまく機能していないのではないかとおもいます。

UPDATESQLについては、私はテーブルTTABLEをつかわず、クエリのみで処理していたのですが、新しくTTABLEを設置し、UPDATESQLを使おうとしたのですが、オプションのところでテーブル名が選択できず、またDATASOURCEからもクエリのみしか指定できませんでした。無理矢理プログラムを書いてみたのですが、認識されずコンパイルエラーになってしまいました。何度も申し訳ないのですが、アドバイスいただけないでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加