Как правильно использовать оператор SQL where в delphi? - PullRequest
1 голос
/ 20 июня 2020

У меня проблема с выдачей оператора SQL. Я знаю, что значение Engli sh должно быть отдельной строкой, и я пробовал это, но мне постоянно выдает одну из этих ошибок

введите описание изображения здесь

 procedure TfrmPetersonGroup.btnEnglishClick(Sender: TObject);
    var
    sSqlQuery:string;
    begin
    //2.4
    dmoBandB.qryQuery.SQL.Clear;
    sSqlQuery:='DELETE FROM tblClients WHERE Nationality =' + ' English';
    dmoBandB.qryQuery.SQL.Text := sSqlQuery;
    dmoBandB.qryQuery.active := true;
    end;

Ответы [ 2 ]

6 голосов
/ 20 июня 2020

Предлагаю вам получить безопасный запрос. Как показано ниже:

procedure SafeDeleteReq(SQLQuery: TSQLQuery; del: string);
begin
  SQLQuery.SQL.Text := 'DELETE FROM tblClients WHERE Nationality=:Nationality';
  SQLQuery.ParamByName('Nationality').AsString := del;
  SQLQuery.ExecSQL();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SafeDeleteReq(SQLQuery1, 'English');
end;
4 голосов
/ 20 июня 2020

Вы можете изменить s Sql на

sSqlQuery:='DELETE FROM tblClients WHERE Nationality = ' + QuotedStr('English');

, чтобы заставить его работать, но это не лучшая идея, см. Ниже.

Ваша версия вызвала ошибку потому что без кавычек синтаксический анализатор Sql решил, что English был идентификатором, например, другим именем столбца, например Nationality.

Использование QuotedStr вокруг значений столбца гарантирует, что символы одинарной кавычки встроены в значении, например

O'Brien

, экранируются правильно.

Другое дело, что вы должны заменить

  dmoBandB.qryQuery.active := true;

на

  dmoBandB.qryQuery.ExecSql;

Причина в том, что установка Active в True эквивалентна вызову .Open, что недопустимо в данном контексте, потому что .Open работает, только если запрос Sql возвращает набор результатов, а DELETE - нет (извините, Я должен был заметить эту проблему впервые). После того, как вы вызвали Exe cSql, вы можете снова открыть таблицу, установив qryQuery Sql .Text в допустимый оператор SELECT, а затем вызвав .Open.

Однако лучший способ избежать ваша первоначальная проблема будет заключаться в том, чтобы привыкнуть использовать параметризованные операторы Sql - см. http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_Parameters_in_Queries, который применим ко всем операторам Sql DML (Insert, Delete, Update, Select, et c). Помимо всего прочего, это может помочь вам избежать уязвимостей Sql инъекций (https://en.wikipedia.org/wiki/SQL_injection).

...