2

使用 Delphi XE,我正在尝试对 TClientDataSet 进行一些过滤,但我无法让不区分大小写的过滤与 LIKE 运算符一起正常工作

考虑这个进行过滤的代码

cdsDocs.DisableControls;
try
  cdsDocs.Filtered := False;
  cdsDocs.FilterOptions := [foCaseInsensitive];
  cdsDocs.Filter := 'Product LIKE ''%' + txtFilter.Text + '%''';
  cdsDocs.Filtered := True;
finally
  cdsDocs.EnableControls;
end;

并认为该数据集的 Product 字段仅包含值“b”和“B”。

  1. 当(txtFilter.Text ='b')我只得到'b'(我期待'b's和'B's)
  2. 当(txtFilter.Text ='B')我只得到'B'(同样,我期待'b's和'B's)

好像 LIKE '%b%' 和 foCaseInsensitive 不能一起工作?我应该怎么做才能让它工作?我阅读了文档,但找不到我的错误(如果有的话)。TIA。

4

1 回答 1

2

一切正常,直到我尝试扩展过滤以允许不区分大小写的搜索(我尝试使用现有的 FilterOption foCaseInsensitive),现在突然我有一个错误?不,这对我来说没有意义。我决定以另一种方式实现所需的不区分大小写的过滤,并保持我的自我完整。

这是修改后的代码(完美运行)

cdDocs.DisableControls;
try
  cdDocs.Filtered := False;
  cdDocs.FilterOptions := [];

  if (cbCaseSensitive.Checked) then
    cdDocs.Filter := 'Product LIKE ''%' + txtFilter.Text + '%'''
  else
    cdDocs.Filter := 'UPPER(Product) LIKE ''%' + UPPERCASE(txtFilter.Text) + '%''';

  cdDocs.Filtered := True;
finally
  cdDocs.EnableControls;
end;

顺便说一句,这是使用 Delphi XE 附带的 Interbase DB Access 组件连接到 Interbase/Firebird 数据库。如果连接到不同的数据库,您可能需要用您选择的 RDBMS 的等效函数替换“UPPER”函数(无论您在等效的 SQL WHERE 子句中使用什么)

于 2013-07-24T01:20:50.867 回答