Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation de paramètres avec ADO Query (mysql/MyConnector)

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.