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

PrimeBeat

我在发布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;
马丁·A

您可以将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查询返回结果集而DELETE无效的情况下才起作用(对不起,我应该第一次注意到这个问题。 )。调用ExecSql后,可以通过将qryQuery的Sql.Text设置为有效的SELECT语句,然后调用.Open来重新打开表。

但是,避免最初问题的一种更好的方法是养成使用参数化Sql语句的习惯-请参阅http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_Parameters_in_Queries,该方法适用于所有Sql DML语句(插入,删除,更新,选择等)。除了其他方面,这可以帮助您避免Sql Injection攻击(https://en.wikipedia.org/wiki/SQL_injection)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章