sql >> Base de Datos >  >> RDS >> Mysql

Uso de parámetros con ADO Query (mysql/MyConnector)

Intentaría agregar SQL.BeginUpdate/SQL.EndUpdate alrededor de Adds; de lo contrario, el texto SQL se analizará cada vez que llame a "Add".

En general, esta es una buena idea, ya que ADOQuery.SQL es un TStringList que tiene un evento OnChange que establece CommandText. El texto SetCommandText luego termina llamando a TADOCommand.AssignCommandText, que hace una buena cantidad de trabajo analizando parámetros y configurando CommandObject.CommandText. A veces, los controladores fallarán con declaraciones SQL parciales, pero esto se ve bien.

Tuve un problema similar hace muchos años, ¡por eso aprendí sobre estas cosas!

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;

Por cierto, el with anidado son realmente feos (que comience la guerra santa)

A veces usaré with , ¡pero nunca anidaría tres niveles! Si es así, al menos reduzca el alcance de con SQL para que termine antes con Parámetros.