我正在为我的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%')
答案 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。