ADOQueryのSQL文のWHERE句に変数は使えないのでしょうか?

解決


もも  2009-07-14 00:04:27  No: 35116

いつもお世話になります。
  Delphiの理解が足りないのか、SQL文の理解が足りないのか判らない
のですが、以下のADOQueryのSQL文でWHERE句には変数は記述出来ない
のでしょうか?
  フォームから入力した値と比較する場合は、ADOQueryのSQL文では
どのような記述になるのでしょうか?
  環境はWindowsXP、Delphi2007です。
  どなたかご教授をお願い致します。
---------------------------------------------------------------
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  g2_SQL      := 'SELECT 名称区分,名称№,名称(ふりがな),'
              +  '名称(漢字),名称(略称),備考 FROM Name_Table'
              +  ' WHERE 名称区分 = g2_int_wk';
  ADOQuery1.SQL.Add(g2_SQL);
  ADOQuery1.Open;
---------------------------------------------------------------

ps.
  1つ前の質問のタイトルがミステイクしましたので、再度アップしました。


オラクル勉強者  2009-07-14 00:53:36  No: 35117

「g2_int_wk」というのは、フォームから入力された値だと補完させて頂くと・・・

  g2_SQL      := 'SELECT 名称区分,名称№,名称(ふりがな),'
              +  '名称(漢字),名称(略称),備考 FROM Name_Table'
              +  ' WHERE 名称区分 = ' + g2_int_wk + ';'

または、
             //g2_int_wkを代入する際に、「'」でくくらない場合
              +  ' WHERE 名称区分 = ''' + g2_int_wk + ''';'  
でデータが取得できると思います。

ももさんが記述したSQLだと
「名称区分の条件はg2_int_wkのデータを持ってきてね」という意味になってしまいますので、
変数で条件を指定する際は、文字列の中にはいれないでください。


DEKO  2009-07-14 01:00:40  No: 35118

g2_SQL := 'SELECT 名称区分,名称№,名称(ふりがな),'
          +  '名称(漢字),名称(略称),備考 FROM Name_Table'
          +  ' WHERE 名称区分 = :_MKBN';
ADOQuery1.SQL.Add(g2_SQL);
ADOQuery1.Parameters.ParamByName('_MKBN').AsInteger := g2_int_wk;
ADOQuery1.Open;

なんて事ができますよ。
パラメータは ":"で開始し、パラメータ名は任意に付けられます。


もも  2009-07-14 01:45:10  No: 35119

いつもお世話になります。
  オラクル勉強者様、DEKO様からご教授頂きましたソースを参考に
以下のようにしましたところ、上手く動きました。
  お忙しいところありがとうございました。
  もう朝から頭痛がするまで悩んでおりました。
  また、よろしくお願い致します。(m_m)
-----------------------------------------------------------------
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  g2_SQL      := 'SELECT 名称区分,名称№,名称(ふりがな),'
              +  '名称(漢字),名称(略称),備考 FROM Name_Table'
              +  ' WHERE 名称区分 = ' + IntToStr(g2_int_wk);
  ADOQuery1.SQL.Add(g2_SQL);
  ADOQuery1.Open;
-----------------------------------------------------------------
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(g2_SQL);
  ADOQuery1.Parameters.ParamByName('_MKBN').Value := g2_int_wk;
  ADOQuery1.Open;
-----------------------------------------------------------------


DEKO  2009-07-14 01:58:30  No: 35120

いやいやいや。

  g2_SQL      := 'SELECT 名称区分,名称№,名称(ふりがな),'
              +  '名称(漢字),名称(略称),備考 FROM Name_Table'
              +  ' WHERE 名称区分 = ' + IntToStr(g2_int_wk);

これだとパラメータが使われていないので、
ADOQuery1.Parameters.ParamByName('_MKBN').Value := g2_int_wk;
これは不要ですよ。


オラクル勉強者  2009-07-14 03:30:01  No: 35121

DEKO様がご教授してくれた方法は
バインド変数を使用しています。

※バインド変数とは?
ttp://e-words.jp/w/E38390E382A4E383B3E38389E5A489E695B0.html

つまり
          +  ' WHERE 名称区分 = :_MKBN';
の「:_MKBN」がバインド変数になります。

Delphiではこのバインド変数に値をセットするには
>ADOQuery1.Parameters.ParamByName('_MKBN').AsInteger := g2_int_wk;
ADOQuery1.Parameters.ParamByName(バインド変数).タイプ := セットする値
の記述を使用します。

SQLをg2_SQLで保持しつつ、OPENする前に検索条件を後でセットするイメージと思ってください。

バインド変数を使用するメリットは、同一のSQLを複数回実行する際にSQL解析が1回で済みます。
デメリットは1回のみの実行する場合は、パフォーマンスが落ちます(といっても微々たるものです。


もも  2009-07-14 13:37:58  No: 35122

いえいえいえ。

  オラクル勉強者様とDEKO様のお二方からご教授頂いた方法を動作確認しましたことを書いたつもりです。ですから、アップしたコーディングは2種類アップしました。


DEKO  2009-07-14 14:22:03  No: 35123

> ですから、アップしたコーディングは2種類アップしました。
いやいやいや(^^;A
そうであれば、以下のように記述しないと混乱しちゃいますよ。

[Case1]
-----------------------------------------------------------------
  ADOQuery1.SQL.Clear;
  g2_SQL := 'SELECT 名称区分,名称№,名称(ふりがな),'
            +  '名称(漢字),名称(略称),備考 FROM Name_Table'
            +  ' WHERE 名称区分 = ' + IntToStr(g2_int_wk);
  ADOQuery1.SQL.Add(g2_SQL);
  ADOQuery1.Open;
  // (処理)
  ADOQuery1.Close;

[Case2]
-----------------------------------------------------------------
  ADOQuery1.SQL.Clear;
  g2_SQL := 'SELECT 名称区分,名称№,名称(ふりがな),'
            +  '名称(漢字),名称(略称),備考 FROM Name_Table'
            +  ' WHERE 名称区分 = :_MKBN';
  ADOQuery1.SQL.Add(g2_SQL);
  ADOQuery1.Parameters.ParamByName('_MKBN').Value := g2_int_wk;
  ADOQuery1.Open;
  // (処理)
  ADOQuery1.Close;

# 現に二人とも混乱しちゃいました。


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

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






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