お世話になります。
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;
単純にSQL文にparam1とかのパラメータが含まれていないからですね。
1回目に成功するのは単にADOQuery1.SQLが空でPrepared=Falseの状態だからだと思います。
(Closeの直後にPreparedプロパティをFalseに戻すとエラーにはならなくなるのでは?
HFUKUSHI さん、早々のお返事ありがとうございます。
ポンコツの私ですが流石にParametersに [param1]は入っています。
成功する1回目と同様なパラメータ条件でも2回目はエラーが発生します。
どうしてでしょうか?
因みに最後に下記を追加しました。
ADOQuery1.Close;
ADOQuery1.Prepared := False;
なるほど、パラメータはデザイン側で設定済みなんですね
フォーム上に配置したADOQuery1のSQLプロパティは空のままですか?
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;
わかりにくい説明ですいません。
HFUKUSHIさん、お返事ありがとうございます。
>フォーム上に配置したADOQuery1のSQLプロパティは空のままですか?
空っぽです。
mamさん、お返事ありがとうございます。
現在、解読中です。
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が書き換わるのはどこ?ということです。