首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >搜索sql表的所有字段时出现语法错误

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

Stack Overflow用户
提问于 2016-08-12 11:45:23
回答 1查看 167关注 0票数 0

我正在为我的sql表创建一个搜索筛选器,我希望能够搜索表的所有字段并返回包含我输入的文本的记录。我有多个表,所以将所有字段硬编码到我的语句中不是一个选项。我尝试了这个方法(请参阅代码片段),但是我得到了这个错误:

在查询表达式(如'%SearchStr%')或( EOIeException类似于'%SearchStr%')或‘%SearchStr%’)或‘%SearchStr% '’中使用消息“语法错误(缺少运算符)”,将类归为fieldContent。进程停止了。

通常,语法错误很容易解决,但我对这个错误一无所知。希望你能帮上忙。谢谢。顺便说一下,fieldContent和SearchStr只是实际内容的表示。

代码语言:javascript
运行
复制
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之前

代码语言:javascript
运行
复制
 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%')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-12 14:38:12

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

您试图使用Field[i].AsString作为语句的左边值检索列名,但这是错误的。TField.AsString将字段的content作为字符串返回,而不是该字段的名称。要检索名称,您需要使用TField.FieldName代替。

代码语言:javascript
运行
复制
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绝对不能降低这种风险。有关为什么这是如此安全风险的信息,请参见小鲍比桌

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38917186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档