Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von Parametern mit ADO-Abfrage (mysql/MyConnector)

Ich würde versuchen, SQL.BeginUpdate/SQL.EndUpdate um die Adds herum hinzuzufügen, da sonst der SQL-Text jedes Mal analysiert wird, wenn Sie "Add" aufrufen.

Dies ist im Allgemeinen eine gute Idee, da ADOQuery.SQL eine TStringList ist, die über ein OnChange-Ereignis verfügt, das CommandText festlegt. SetCommandText-Text ruft dann TADOCommand.AssignCommandText auf, was eine Menge Arbeit beim Parsing von Parametern und beim Setzen von CommandObject.CommandText macht. Manchmal schlagen Treiber mit teilweisen SQL-Anweisungen fehl, aber das Zeug sieht in Ordnung aus.

Ich hatte vor vielen Jahren ein ähnliches Problem - deshalb habe ich von diesem Zeug erfahren!

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;

Übrigens, der verschachtelte with s sind wirklich hässlich (lasst den heiligen Krieg beginnen)

Ich werde manchmal with verwenden , würde aber niemals drei Ebenen verschachteln! Wenn ja, reduzieren Sie zumindest den Geltungsbereich von mit SQL, sodass er vorher mit Parameters endet.