如何在 delphi 中正确使用 SQL where 语句?

How to use a SQL where statement in delphi properly?

我在发出 SQL 语句时遇到问题。我知道英文值本身应该是一个字符串,我已经尝试过了,但它一直向我抛出这些错误之一

 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;

您可以将 sSql 更改为

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

只是让它工作,但这不是最好的主意,请参见下文。

您的版本导致错误,因为没有引号,Sql 解析器认为 English 是一个标识符,例如另一个列名,例如 Nationality.

在列值周围使用 QuotedStr 可确保在值中嵌入单引号字符,例如

奥布莱恩

正确转义。

另一件事是你应该更换

  dmoBandB.qryQuery.active := true;

来自

  dmoBandB.qryQuery.ExecSql;

原因是将 Active 设置为 True 等同于调用 .Open,在此上下文中无效,因为 .Open 仅在 Sql 查询 returns 结果集并且 DELETE 执行时有效不是(抱歉,我应该第一时间注意到这个问题)。调用 ExecSql 后,您可以通过将 qryQuery 的 Sql.Text 设置为有效的 SELECT 语句然后调用 .Open.

来重新打开 table

但是,避免最初问题的更好方法是养成使用参数化 Sql 语句的习惯 - 请参阅 http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_Parameters_in_Queries, which is applicable to all Sql DML statements (Insert, Delete, Update, Select, etc). Apart from anything else, this may help you avoid Sql Injection exploits (https://en.wikipedia.org/wiki/SQL_injection)。

我建议您进行安全查询。如下:

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;