Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo dei parametri con ADO Query (mysql/MyConnector)

Proverei ad aggiungere SQL.BeginUpdate/SQL.EndUpdate attorno alle aggiunte, altrimenti il ​​testo SQL verrà analizzato ogni volta che chiami "Aggiungi".

Questa è generalmente una buona idea, poiché ADOQuery.SQL è un TStringList che ha un evento OnChange che imposta CommandText. Il testo SetCommandText finisce quindi per chiamare TADOCommand.AssignCommandText che esegue una discreta quantità di lavoro per l'analisi dei parametri e l'impostazione di CommandObject.CommandText. A volte i driver falliscono con istruzioni SQL parziali, ma questa roba sembra a posto.

Ho avuto un problema simile molti anni fa, ecco perché ho imparato queste cose!

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;

A proposito, il with annidato sono davvero brutti (che la guerra santa abbia inizio)

A volte userò with , ma non anniderebbe mai tre livelli! Se lo sei, riduci almeno l'ambito di con SQL in modo che termini prima con Parametri.