Zkusil bych přidat SQL.BeginUpdate/SQL.EndUpdate kolem Adds, jinak bude text SQL analyzován pokaždé, když zavoláte "Add".
To je obecně dobrý nápad, protože ADOQuery.SQL je TStringList, který má událost OnChange, která nastavuje CommandText. Text SetCommandText pak skončí voláním TADOCommand.AssignCommandText, který udělá velké množství práce při analýze parametrů a nastavení CommandObject.CommandText. Někdy ovladače selžou s částečnými příkazy SQL, ale tohle vypadá OK.
Měl jsem podobný problém před mnoha lety – proto jsem se o těchto věcech dozvěděl!
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, vnořené with
s jsou opravdu ošklivé (ať začne svatá válka)
Někdy použiji with
, ale nikdy by nevnořil tři úrovně! Pokud ano, alespoň snižte rozsah pomocí SQL tak, aby skončil dříve parametrem.