2016-08-12 64 views
0

我正在为我的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%') 
+0

就在'tblInfo.Open;'之前,添加'ShowMessage(tblInfo.SQL.Text);'看看你是否能得到你所期望的。另外,对SQL注入进行一些研究 - 通过使用unsanitized用户输入来连接SQL,您已经让自己变得更加开放。 [小巴比表](http://littlebobbytables.com)会爱你。 –

+0

嗨,肯我编辑我的问题与ShowMessage(tblInfo.SQL.Text)的结果。它发出了正确的结果。另外,封装在QoutedStr()中的字符串是否仍然会对SQL注入造成负面影响? @KenWhite –

+0

是的,封装在QuotedStr()中的字符串非常容易受到SQL注入的攻击。你读过我给你的链接了吗?你的SQL不是*发出正确的结果*。我看到您添加的SQL至少有6个问题 - “2”,“0832133123”,“-',”2016-03/08“和”1996-08-19“,”1908966000234“和”234567890“分别是在我遇到过的任何SQL方言中没有有效的列名称。如果你的SQL不能在管理工具中执行,你可以运行它进行测试,它也不会在你的Delphi应用程序中运行。 –

回答

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注入,因为它盲目地使用unsanitized用户数据来连接的SQL语句。这是一个非常糟糕的主意,因为它会使整个数据库处于危险之中。使用QuotedStr完全不能减少这种风险。请参阅Little Bobby Tables以了解有关这种安全风险的原因。

+0

谢谢你解决这个错误。我知道这是有勇气的,但目前这不是我的问题。这是一个学校项目,我首先关注设计的其他方面,然后再关注注入。谢谢您的帮助。 –

+0

快速问题@Ken White,您如何使用LIKE语句(例如%)使用参数:参数% –

+0

您可以在代码中使用':Parameter'并在'%'+ ParamValue +'%''中设置参数。 –