パラメータが見つかりません


ガオ~  2024-06-06 09:51:44  No: 151496  IP: [192.*.*.*]

お世話になります。
Delphi 10.1 Belrin update2
Oracle database
以上の環境で開発をしています。
簡単なデータベースアクセス構文を作ったのですが
ボタンのクリックイベントが一回目は正常に実行するのですが
続けて2回目をクリックすると「ADOQuery1のparam1パラメータが見つかりません」というエラーが発生します。
以下が構文です。
どこが原因でしょうか。
***************************************************
procedure TfrmSeizoGenka.Button1Click(Sender: TObject);
var
  SQL1 : String;
begin
  SQL1 := 'SELECT n.JUCYUNO_H, n.JUCYUNO_D, h.KISYU, d.HINBAN, d.SEIBAN, '    //0-4
        + 'n.KOTEI_CD, n.SYAIN_CODE, n.SAGYO_TIME, n.SAGYO_TIME * k.CHAGE '   //5-8
        + 'FROM TR_JUCYU_H h, TR_JUCYU_D d, TR_NIPPO n, TM_KOTEI k '
        + 'WHERE n.JUCYUNO_H = h.JUCYUNO_H(+) '
        + 'AND n.JUCYUNO_H = d.JUCYUNO_H(+) '
        + 'AND n.JUCYUNO_D = d.JUCYUNO_D(+) '
        + 'AND h.REC_KBN = 0 '
        + 'AND d.REC_KBN = 0 '
        + 'AND n.KOTEI_CD = k.KOTEI_CODE(+)';

  with ADOQuery1 do
  begin
    Close;

    if (Trim(jNoW.Text) = '') then
      parameters.ParamByName('param1').Value := '%'
    else
      parameters.ParamByName('param1').Value := '%' + Trim(jNoW.Text) + '%';

    if (Trim(hinbanW.Text) = '') then
      parameters.ParamByName('param2').Value := '%'
    else
      parameters.ParamByName('param2').Value := '%' + Trim(hinbanW.Text) + '%';

    if (Trim(seibanW.Text) = '') then
      parameters.ParamByName('param3').Value := '%'
    else
      parameters.ParamByName('param3').Value := '%' + Trim(seibanW.Text) + '%';

    if (Trim(custNmW.Text) = '') then
      parameters.ParamByName('param4').Value := '%'
    else
      parameters.ParamByName('param4').Value := '%' + Trim(custNmW.Text) + '%';

    if (Trim(kisyuW.Text) = '') then
      parameters.ParamByName('param5').Value := '%'
    else
      parameters.ParamByName('param5').Value := '%' + Trim(kisyuW.Text) + '%';

    if (Trim(bikoW.Text) = '') then
      parameters.ParamByName('param6').Value := '%'
    else
      parameters.ParamByName('param6').Value := '%' + Trim(bikoW.Text) + '%';

    SQL.Text := SQL1;
    Open;

    with DataSource1.DataSet do
    begin
      First;

      if RecordCount > 0 then
      begin

        with ADOCommand2 do
        begin
          CommandText := 'DELETE FROM TEMP_SEIZOGENKA';
          CommandType := cmdText;
          Execute;

          CommandText := 'COMMIT';
          CommandType := cmdText;
          Execute;
        end;


      end;
   end;
  end;
end;



編集    削除
HFUKUSHI  2024-06-06 14:13:56  No: 151497  IP: [192.*.*.*]

単純にSQL文にparam1とかのパラメータが含まれていないからですね。
1回目に成功するのは単にADOQuery1.SQLが空でPrepared=Falseの状態だからだと思います。
(Closeの直後にPreparedプロパティをFalseに戻すとエラーにはならなくなるのでは?

編集    削除
ガオ~  2024-06-06 14:43:16  No: 151498  IP: [192.*.*.*]

HFUKUSHI さん、早々のお返事ありがとうございます。  
ポンコツの私ですが流石にParametersに [param1]は入っています。
成功する1回目と同様なパラメータ条件でも2回目はエラーが発生します。
どうしてでしょうか?

因みに最後に下記を追加しました。
ADOQuery1.Close;
ADOQuery1.Prepared := False;

編集    削除
HFUKUSHI  2024-06-06 16:07:57  No: 151499  IP: [192.*.*.*]

なるほど、パラメータはデザイン側で設定済みなんですね
フォーム上に配置したADOQuery1のSQLプロパティは空のままですか?

編集    削除
mam  2024-06-06 16:31:49  No: 151500  IP: [192.*.*.*]

HFUKUSHI様の言う通りなのですが、説明が難しいですよね。

例1:IDEからADOQuery1のparametersを1つ設定しておいたとします。
if ADOQuery1.Active then ADOQuery1.Close;
ADOQuery1.SQL.Text:='select * from t_user '; //パラメータ無のSQLを設定
//IDEから設定していたパラメータ(parameters)は0個になっています
ADOQuery1.Open; 

例2:IDEからADOQuery1のparametersを消して0個だったとします。
if ADOQuery1.Active then ADOQuery1.Close;
ADOQuery1.SQL.Text:='select * from tm_user where user_id=:user_id'; //パラメータ有のSQLを設定
//パラメータ(parameters)は1個になっています
ADOQuery1.Parameters.ParamByName('user_id').Value:=1; //パラメータを設定
ADOQuery1.Open; 

わかりにくい説明ですいません。

編集    削除
ガオ~  2024-06-06 16:41:31  No: 151501  IP: [192.*.*.*]

HFUKUSHIさん、お返事ありがとうございます。
>フォーム上に配置したADOQuery1のSQLプロパティは空のままですか?
空っぽです。

編集    削除
ガオ~  2024-06-06 16:47:50  No: 151502  IP: [192.*.*.*]

mamさん、お返事ありがとうございます。
現在、解読中です。

編集    削除
HFUKUSHI  2024-06-06 18:13:21  No: 151503  IP: [192.*.*.*]

if (Trim(jNoW.Text) = '') then の行にブレークポイントを置いて、ADOQuery1.Parameters(のCountとかItems[0]~Items[5])がどうなっているか、1回目と2回目で比較してみては?
1回目はCountが6以上で、Items[]に'param1'~'param6'がある状態でしょうし、2回目にエラーになるということはItems[]から'param1'がなくなっている、ということだと思うのですが、じゃあADOQuery1.Parametersが書き換わるのはどこ?ということです。

編集    削除