J'essaierais d'ajouter SQL.BeginUpdate/SQL.EndUpdate autour des Adds, sinon le texte SQL sera analysé chaque fois que vous appelez "Add".
C'est généralement une bonne idée, car ADOQuery.SQL est un TStringList qui a un événement OnChange qui définit le CommandText. Le texte SetCommandText finit alors par appeler TADOCommand.AssignCommandText qui effectue une bonne quantité de travail d'analyse des paramètres et de définition de CommandObject.CommandText. Parfois, les pilotes échouent avec des instructions SQL partielles, mais cela semble correct.
J'ai eu un problème similaire il y a de nombreuses années - c'est pourquoi j'ai appris ce genre de choses !
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, le with
imbriqué s sont vraiment moches (que la guerre sainte commence)
J'utiliserai parfois with
, mais n'imbriquerait jamais trois niveaux ! Si c'est le cas, réduisez au moins la portée de avec SQL afin qu'il se termine avant avec les paramètres.