Jag skulle försöka lägga till SQL.BeginUpdate/SQL.EndUpdate runt Adds, annars kommer SQL-texten att tolkas varje gång du anropar "Add".
Detta är generellt sett en bra idé, eftersom ADOQuery.SQL är en TStringList som har en OnChange-händelse som ställer in CommandText. SetCommandText-texten hamnar sedan i att anropa TADOCommand.AssignCommandText som gör en hel del arbete med att analysera parametrar och ställa in CommandObject.CommandText. Ibland misslyckas drivrutiner med partiella SQL-satser, men det här ser OK ut.
Jag hade ett liknande problem för många år sedan - det var därför jag lärde mig om det här!
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, den kapslade with
s är riktigt fula (låt det heliga kriget börja)
Jag kommer ibland att använda with
, men skulle aldrig bygga tre nivåer! Om du är det, minska åtminstone omfattningen av med SQL så att den slutar före med Parametrar.