搜索sql表的所有字段时出现语法错误

时间:2016-08-12 11:45:24

标签: sql delphi search syntax syntax-error

我正在为我的sql表创建一个搜索过滤器,我希望能够搜索表的所有字段并返回包含我输入的文本的记录。我有多个表,所以硬编码所有字段到我的声明不是一个选项。我试过这个方法(参见代码snippit),但是我收到了这个错误:

  

类EOIeException,在查询表达式中显示消息'语法错误(缺少运算符)'(fieldContent LIKE'%SearchStr%')   或(fieldContent LIKE'%SearchStr%')   或者''。流程停止了。

通常语法错误很容易解决,但我不知道这一点。希望你能帮忙。谢谢。 Btw fieldContent和SearchStr只是实际内容的表示。

qryInfo.SQL.Clear;
qryInfo.SQL.Add('SELECT * FROM ' + tableName);
qryInfo.Open;

tblInfo.SQL.Clear;
tblInfo.SQL.Add('SELECT * FROM ' + tableName);
tblInfo.SQL.Add('WHERE (' + qryInfo.Fields[0].AsString + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')');

for i:= 1 to qryInfo.FieldCount - 1 do
  begin
    tblInfo.SQL.Add(' OR (' + qryInfo.Fields[i].AsString + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')');
  end;
tblInfo.Open;

在tblInfo.Open之前放入ShowMessage(tblInfo.Text)时我得到了

 SELECT * FROM tblGymnast
 WHERE (EG000002 LIKE '%S%')
 OR (Erasmus LIKE '%S%')
 OR (Petrus LIKE '%S%')
 OR (Peter LIKE '%S%')
 OR (EF000001 LIKE '%S%')
 OR (2 LIKE '%S%')
 OR (0832133123 LIKE '%S%')
 OR (SFEW33FWX LIKE '%S%')
 OR (- LIKE '%S%')
 OR (2016/03/08 LIKE '%S%')
 OR (1996-08-19 LIKE '%S%')
 OR (M LIKE '%S%')
 OR (Afrikaans LIKE '%S%')
 OR (White LIKE '%S%')
 OR (Trampoline LIKE '%S%')
 OR (1908966000234 LIKE '%S%')
 OR (EL000004 LIKE '%S%')
 OR (ES000002 LIKE '%S%')
 OR (EL000003 LIKE '%S%')
 OR (TR000002 LIKE '%S%')
 OR (ED000001 LIKE '%S%')
 OR (234567890 LIKE '%S%')
 OR (EM000001 LIKE '%S%')

1 个答案:

答案 0 :(得分:2)

编辑后添加生成的SQL,代码中的错误变得非常清晰。 (生成的SQL包含无效的列名,以及我指出后面的后续注释确认它实际上是数据。)

您尝试使用Field[i].AsString检索列名作为语句的左侧值,但这是错误的。 TField.AsString将字段内容作为字符串返回,而不是字段名称。要检索名称,您需要改为使用TField.FieldName

qryInfo.SQL.Clear;
qryInfo.SQL.Add('SELECT * FROM ' + tableName);
qryInfo.Open;

tblInfo.SQL.Clear;
tblInfo.SQL.Add('SELECT * FROM ' + tableName);
tblInfo.SQL.Add('WHERE (' + qryInfo.Fields[0].FieldName + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')');

for i:= 1 to qryInfo.FieldCount - 1 do
begin
  tblInfo.SQL.Add(' OR (' + qryInfo.Fields[i].FieldName + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')');
end;
tblInfo.Open;

我要指出这段代码非常容易到SQL注入,因为它盲目地使用未经过处理的用户数据来连接SQL语句。这是一个非常糟糕的主意,因为它会使整个数据库面临风险。使用QuotedStr绝对没有减少风险。有关为何存在此类安全风险的信息,请参阅Little Bobby Tables