Вы можете изменить 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).