我正在为我的sql表创建一个搜索过滤器,我希望能够搜索表的所有字段并返回包含我输入的文本的记录。我有多个表,所以硬编码到我的声明中的所有字段不是一个选项。这个方法我试过(见代码片段),但我收到此错误:搜索sql表的所有字段时出现语法错误
class EOIeException with message 'Syntax error (missing operator) in query expression '(fieldContent LIKE '%SearchStr%') OR (fieldContent LIKE '%SearchStr%') OR ''. Process stopped.
通常语法错误很容易解决,但我没有与这一个线索。希望你能帮助。谢谢。顺便说一句,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%')
就在'tblInfo.Open;'之前,添加'ShowMessage(tblInfo.SQL.Text);'看看你是否能得到你所期望的。另外,对SQL注入进行一些研究 - 通过使用unsanitized用户输入来连接SQL,您已经让自己变得更加开放。 [小巴比表](http://littlebobbytables.com)会爱你。 –
嗨,肯我编辑我的问题与ShowMessage(tblInfo.SQL.Text)的结果。它发出了正确的结果。另外,封装在QoutedStr()中的字符串是否仍然会对SQL注入造成负面影响? @KenWhite –
是的,封装在QuotedStr()中的字符串非常容易受到SQL注入的攻击。你读过我给你的链接了吗?你的SQL不是*发出正确的结果*。我看到您添加的SQL至少有6个问题 - “2”,“0832133123”,“-',”2016-03/08“和”1996-08-19“,”1908966000234“和”234567890“分别是在我遇到过的任何SQL方言中没有有效的列名称。如果你的SQL不能在管理工具中执行,你可以运行它进行测试,它也不会在你的Delphi应用程序中运行。 –