我正在为我的sql表创建一个搜索筛选器,我希望能够搜索表的所有字段并返回包含我输入的文本的记录。我有多个表,所以将所有字段硬编码到我的语句中不是一个选项。我尝试了这个方法(请参阅代码片段),但是我得到了这个错误:
在查询表达式(如'%SearchStr%')或( EOIeException类似于'%SearchStr%')或‘%SearchStr%’)或‘%SearchStr% '’中使用消息“语法错误(缺少运算符)”,将类归为fieldContent。进程停止了。
通常,语法错误很容易解决,但我对这个错误一无所知。希望你能帮上忙。谢谢。顺便说一下,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;当我把ShowMessage(tblInfo.Text)放在tblInfo.Open之前
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%')发布于 2016-08-12 14:38:12
在编辑以添加生成的SQL之后,代码中的错误变得非常清楚。(生成的SQL包含无效的列名,在我指出后的后续注释确认它实际上是数据。)
您试图使用Field[i].AsString作为语句的左边值检索列名,但这是错误的。TField.AsString将字段的content作为字符串返回,而不是该字段的名称。要检索名称,您需要使用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注入来说是非常脆弱的,因为它盲目地使用未净化的用户数据来连接语句。这是一个非常糟糕的主意,因为它会使整个数据库处于危险之中。使用QuotedStr绝对不能降低这种风险。有关为什么这是如此安全风险的信息,请参见小鲍比桌。
https://stackoverflow.com/questions/38917186
复制相似问题