我在发布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查询返回结果集而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] 删除。
我来说两句