データベースのテーブルにデータがあるかどうか調べるには?

解決


とと  2010-01-10 08:27:08  No: 36881

質問があります。データベース上のテーブルにデータがあるかどうかDelphiのプログラムで調べたいと思っています。クエリまたはDBgridを調べようと考えているのですが、まだデータベースの知識が浅いため、苦戦しています。考えている方法は、while not query.EOF doでデータを見ていくか、select文でグリッドに表示し、そこのフィールドに何かしらのデータが入っているかどうか判断するということです。
それぞれの方法について、if文で「ifデータがなかったら(または、DGグリッドのフィールドに何も値がなかったら、このような処理をする」といった命令文はありますか?オラクルの9使っています。Delphiのバージョンは6です。


Delphi大好き  2010-01-10 08:55:53  No: 36882

query1.sql.text := 'SELECT COUNT(*) FROM テ−ブル名;';
query1.oepen;

if 0 = query1.fieldbyname('COUNT(*)').asinteger then
  showmessage('データがありません');

以上でどうでしょうか?
スペルミスもしあったらすいません。


Delphi大好き  2010-01-10 09:02:34  No: 36883

ミスquery1.oepen;

正しくはquery1.open;
でした。すいません。


DEKO  2010-01-10 09:31:32  No: 36884

こんにちは。

1.Count(*) を使う 
  Query1.SQL.Text := 'Select Count(*) From Table_TEST';
  Query1.Open;
  if Query1.Fields[0].AsInteger = 0 then
    ShowMessage('空です');

2.RecordCount を使う
  Query1.SQL.Text := 'Select * From Table_TEST';
  Query1.Open;
  if Query1.RecordCount = 0 then
    ShowMessage('空です');

3.IsEmpty を使う
  Query1.SQL.Text := 'Select * From Table_TEST';
  Query1.Open;
  if Query1.IsEmpty then
    ShowMessage('空です');

2.の RecordCount を使う方法は、Open の後に、
  Query1.Last;
  Query1.First;
または
  Query1.FetchAll;
が必要な場合があります。あまりオススメできない方法です。


とと  2010-01-10 17:48:18  No: 36885

ありがとうございます。
そうなると、もしデータの件数をカウントして、それをTEditに表示したい場合は、TEdit.Text := 'Select Count(*) From Table_TEST';  や
TEdit.Text :=  Query1.RecordCount; ということになりますか?


igy  2010-01-10 18:08:08  No: 36886

>TEdit.Text := 'Select Count(*) From Table_TEST';

は、'Select Count(*) From Table_TEST'という文字列が格納されます。

# “Delphi大好き”さんや DEKO さんはTQueryを使うように書いています・・・

>TEdit.Text :=  Query1.RecordCount;

は、:= IntToStr(Query1.RecordCount);

で良いとおもいます。


DEKO  2010-01-11 01:33:58  No: 36887

オマケで。

4.BOF/EOF を使う
  Query1.SQL.Text := 'Select * From Table_TEST';
  Query1.Open;
  if (Query1.BOF and Query1.EOF) then
    ShowMessage('空です');

> データの件数をカウント

1.Count(*) を使う 
  Query1.SQL.Text := 'Select Count(*) From Table_TEST';
  Query1.Open;
  ShowMessage(IntToStr(Query1.Fields[0].AsInteger));

2.While で回す 
  Query1.SQL.Text := 'Select * From Table_TEST';
  Query1.Open;
  Cnt := 0;
  while not Query1.EOF do
    begin
      Inc(Cnt);
      Query1.Next;
    end;
  ShowMessage(IntToStr(Cnt));

3.RecordCount を使う
  Query1.SQL.Text := 'Select * From Table_TEST';
  Query1.Open;
  ShowMessage(IntToStr(Query1.RecordCount));

3.の RecordCount を使う方法は、Open の後に、
  Query1.Last;
  Query1.First;
または
  Query1.FetchAll;
が必要な場合があります。あまりオススメできない方法です。

件数取得用に Count(*) の SQL を別途実行するのは無駄に思えるかもしれませんが、
速度の面から考えると RecordCount を使うより Count(*) を別途実行した方が
速い事が多いです (特に件数の多いテーブル)。


とと  2010-01-12 07:59:58  No: 36888

たくさんの情報ありがとうございました。


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

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






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