Spróbowałbym dodać SQL.BeginUpdate/SQL.EndUpdate wokół Adds, w przeciwnym razie tekst SQL będzie analizowany za każdym razem, gdy wywołasz "Add".
Ogólnie jest to dobry pomysł, ponieważ ADOQuery.SQL to TStringList, który ma zdarzenie OnChange, które ustawia CommandText. Tekst SetCommandText kończy się wywołaniem TADOCommand.AssignCommandText, który wykonuje sporo pracy przy przetwarzaniu parametrów i ustawianiu CommandObject.CommandText. Czasami sterowniki zawodzą z częściowymi instrukcjami SQL, ale to wygląda OK.
Miałem podobny problem wiele lat temu - dlatego dowiedziałem się o tym!
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;
BTW, zagnieżdżone with
są naprawdę brzydkie (niech rozpocznie się święta wojna)
Czasami używam with
, ale nigdy nie zagnieżdżałby trzech poziomów! Jeśli tak, przynajmniej zmniejsz zakres z SQL, aby kończył się wcześniej z parametrami.