Delphi TClientDataSet使用LIKE和foCaseInsensitive进行过滤

时间:2013-07-22 06:09:21

标签: delphi delphi-xe tclientdataset

使用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'和'B')
  2. 当(txtFilter.Text ='B')我只得到'B'(同样,我期待'b'和'B')
  3. 似乎LIKE'%b%'和foCaseInsensitive不能一起工作?我该怎么做才能让它发挥作用?我阅读了文档,但我找不到我的错误(如果有的话)。 TIA。

1 个答案:

答案 0 :(得分:1)

一切正常,直到我尝试扩展过滤以允许不区分大小写的搜索(我尝试使用现有的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数据库。如果连接到另一个DB,可能需要将“UPPER”函数替换为所选RDBMS的等效函数(无论您在等效的SQL WHERE子句中使用什么)