Addsの周りにSQL.BeginUpdate/SQL.EndUpdateを追加してみます。そうしないと、「Add」を呼び出すたびにSQLテキストが解析されます。
ADOQuery.SQLはCommandTextを設定するOnChangeイベントを持つTStringListであるため、これは一般的に良い考えです。次に、SetCommandTextテキストは、パラメータを解析し、CommandObject.CommandTextを設定するかなりの量の作業を行うTADOCommand.AssignCommandTextを呼び出すことになります。ドライバーが部分的なSQLステートメントで失敗することがありますが、これは問題ないように見えます。
私は何年も前に同様の問題を抱えていました-それが私がこのことについて学んだ理由です!
procedure TForm1.login();
var
Qry : TADOQuery;
begin
Qry := CreateSQL;
try
Qry.SQL.BeginUpdate;
Qry.SQL.Add('SELECT');
Qry.SQL.Add(' *');
Qry.SQL.Add('FROM');
Qry.SQL.Add(' LisenswebUsers');
Qry.SQL.Add('WHERE UserName = :MyUsername '); // debugger exception here
Qry.SQL.Add(' AND UserPassword = :MyPassword '); // debugger exception here
Qry.SQL.EndUpdate;
Qry.Parameters.ParamByName('MyUsername').value := txtLogin.text;
Qry.Parameters.ParamByName('MyPassword').value := strmd5(txtPassword.text);
Qry.Open;
if Qry.Recordcount <> 1 then
begin
lblLoggedinAs.Text := format('Du er logget inn som: %s (%s)',[FieldByName('Username').AsString,FieldByName('UserEmailaddress').AsString]);
MainPageControl.ActivePageIndex := 1;
end
else
begin
txtPassword.Text := '';
txtPassword.SetFocus;
end;
finally
Qry.Free;
end;
end;
ところで、ネストされたwith
sは本当に醜いです(聖戦を始めましょう)
with
を使用することもあります 、しかし、3つのレベルをネストすることは決してありません!もしそうなら、少なくともSQLのスコープを縮小して、前にパラメータで終了するようにします。