sql >> Databáze >  >> RDS >> Mysql

Použití parametrů s ADO Query (mysql/MyConnector)

Zkusil bych přidat SQL.BeginUpdate/SQL.EndUpdate kolem Adds, jinak bude text SQL analyzován pokaždé, když zavoláte "Add".

To je obecně dobrý nápad, protože ADOQuery.SQL je TStringList, který má událost OnChange, která nastavuje CommandText. Text SetCommandText pak skončí voláním TADOCommand.AssignCommandText, který udělá velké množství práce při analýze parametrů a nastavení CommandObject.CommandText. Někdy ovladače selžou s částečnými příkazy SQL, ale tohle vypadá OK.

Měl jsem podobný problém před mnoha lety – proto jsem se o těchto věcech dozvěděl!

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, vnořené with s jsou opravdu ošklivé (ať začne svatá válka)

Někdy použiji with , ale nikdy by nevnořil tři úrovně! Pokud ano, alespoň snižte rozsah pomocí SQL tak, aby skončil dříve parametrem.



  1. ClassNotFoundException v programu JDBC navzdory přidání souboru JAR ovladače

  2. Jak otestovat vstup crontab?

  3. Jak mohu ručně vložit soubor .png nebo .jpeg do sloupce bytea v PostgreSQL?

  4. Nelze vzdáleně přistupovat k instanci SQL Server 2008 R2