【发布时间】:2014-08-15 16:08:32
【问题描述】:
我在我的 delphi 项目中使用 Zeos 和 mysql。 我想做的是使用文本框过滤数据集。
为此,我在文本框“OnChange”事件中使用以下查询:
ZGrips.Active := false;
ZGrips.SQL.Clear;
ZGrips.SQL.Add('SELECT Part_Name, Description, OrderGerman, OrderEnglish FROM Part');
ZGrips.SQL.Add('WHERE Part_Name LIKE ' + '"%' + trim(txt_search.Text) + '%"');
ZGrips.Active := true;
在我运行并在文本框中键入第一个字符后,我的 DBGrid 中得到了空数据集, 所以 DBGrid 什么都没有显示,那么如果我输入第二个字符,我会在 DBGrid 中得到一些结果。甚至更奇怪的行为:如果我将在我的 SQL 查询中使用 AS 子句,例如:
Part_Name AS blablabla,
Description AS blablabla,
OrderGerman AS OG,
OrderEnglish AS OE
在这种情况下,DBGrid 只显示 2 列:Part_Name 和 Description,我不明白为什么它忽略了第 3 列和第 4 列。
提前感谢您的帮助。
【问题讨论】:
-
在用户输入文本框时不断重新执行 SQL 查询不是一个好主意。相反,请执行以下操作:a) 在表单上放置一个 TTimer,间隔为 2-300 b) 在文本编辑中,只需在其 OnTimer 事件中启用计时器 c),禁用 TTimer 并执行 SQL 查询。这可能无法解决您的问题,但应该更容易找出问题所在。当然,在理想情况下,您应该在后台线程中执行 SQL 查询,以免 UI 在执行时停止。
-
哦,有人可能会建议您将 SQL 查询重写为参数化查询,以减少 SQL 注入的范围 - en.wikipedia.org/wiki/Sql_injection。
-
同意 MartynA 关于将其置于计时器上,这允许用户快速输入多个字符,而无需对每个字符更改执行查询。
-
好的,我会设置计时器,看看它是否改变了什么。我想知道,我对另一种形式使用相同的方法并且效果很好..
-
另一个注意事项:此网格来自 TMS 网格包 - TDBAdvGrid。当我使用 DBGrid 时,它显示所有 4 列,但 DBAdvGrid 仅显示 2 列..
标签: mysql sql delphi filter dbgrid