Jeg ville prøve at tilføje SQL.BeginUpdate/SQL.EndUpdate omkring Tilføjerne, ellers vil SQL-teksten blive parset hver gang du kalder "Tilføj".
Dette er generelt en god idé, da ADOQuery.SQL er en TStringList, der har en OnChange-begivenhed, der sætter CommandText. SetCommandText-teksten ender derefter med at kalde TADOCommand.AssignCommandText, som udfører en del arbejde med at parse parametre og indstille CommandObject.CommandText. Nogle gange vil drivere fejle med delvise SQL-sætninger, men disse ting ser OK ud.
Jeg havde et lignende problem for mange år siden - det var derfor, jeg lærte om det her!
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 indlejrede with
s er virkelig grimme (lad den hellige krig begynde)
Jeg vil nogle gange bruge with
, men ville aldrig indlejre tre niveauer! Hvis du er, skal du i det mindste reducere omfanget af med SQL, så det ender før med parametre.