Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando parâmetros com ADO Query (mysql/MyConnector)


Eu tentaria adicionar SQL.BeginUpdate/SQL.EndUpdate ao redor dos Adds, caso contrário, o texto SQL será analisado toda vez que você chamar "Add".

Isso geralmente é uma boa ideia, pois ADOQuery.SQL é um TStringList que possui um evento OnChange que define o CommandText. O texto SetCommandText acaba chamando TADOCommand.AssignCommandText, que faz uma boa quantidade de trabalho analisando parâmetros e configurando CommandObject.CommandText. Às vezes, os drivers falham com instruções SQL parciais, mas essas coisas parecem boas.

Eu tive um problema semelhante há muitos anos - é por isso que aprendi sobre essas coisas!
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, o with aninhado s são realmente feios (que comece a guerra santa)

Às vezes, usarei with , mas nunca aninharia três níveis! Se estiver, pelo menos reduza o escopo de com SQL para que termine antes com Parâmetros.