3

尝试将过滤器应用于 Delphi XE2 中的 ADO 数据集时遇到问题...

Filter := ' [Name] like ''%john'' ';

它引发了一个异常:

Project Test.exe raised exception class EOleException with message 
'Arguments are of the wrong type, are out of acceptable range, 
or are in conflict with one another'. Process stopped. 

但使用时:

Filter := ' [Name] like ''john%'' '

它工作正常!

为什么?

4

3 回答 3

3

运算符只能是以下之一: = < > <= >= <> LIKE 如果使用 LIKE 运算符,还可以使用 * 或 % 通配符作为字符串中的最后一个字符或作为第一个和最后一个字符在字符串中。

http://www.devguru.com/technologies/ado/quickref/recordset_filter.html

您可以在事件 OnFilterRecord 上捕获过滤器:

procedure TForm1.ADODataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
  iPos: Integer;
begin
  iPos:= pos('john',ADODataSet1name.AsString);
  if (iPos>0) and
     (iPos = length(ADODataSet1name.AsString)-3) then
  begin
    Accept:= True;
  end
  else
  begin
    Accept:= False;
  end;
end;

或者

function TForm1.IsLastCriteria(AText: String): Boolean;
var
  iPos: Integer;
begin
  iPos:= pos(AText,ADODataSet1name.AsString);
  Result:= (iPos>0) and
           (iPos = length(ADODataSet1name.AsString)-length(AText)-1);
end;

procedure TForm1.ADODataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept:= IsLastCriteria('john');
end;
于 2012-09-12T09:04:23.657 回答
2

评论中提到了这个问题的最简单答案。如果你使用星号而不是百分号,一切都会很好用 Filter := ' [Name] like ''*john'' ';

于 2014-06-19T11:40:14.980 回答
2

作为。我仍然要求您阅读http://www.catb.org/esr/faqs/smart-questions.html#beprecise并相应地描述您的环境。

  • 什么是数据库服务器?
  • MDAC/ADO 组件是什么版本?
  • 查询是什么?
  • SQL 中的名称列类型是什么?

您正在“提高”评论,这很好。但你不回答问题。这并不好。我们不是 ESPers,我们无法读懂你的想法。

我在上面的评论中给了你一些建议。你试过了吗?他们工作了吗?引用它们:

  1. 也许您可以将 ADO/MDAC 更新到 2.8sp1 版本。参考的 MSDN 知识库文章被告知适用于 MDAC 最高 2.7 版本。也许 2.8sp1 不再有这个限制。
  2. 也许您可以使用一些特定于数据服务器的技巧,例如将名称的最后 4 个字母复制到单独的列中。
  3. 也许您可以将该条件移动到 SQL SELECT WHERE 子句中并重新打开查询。
  4. 也许有像 TBDEDataSet.OnFilterRecord 这样的事件处理程序

有 4 种解决方法,您要么没有尝试,要么没有报告结果。不太好。

  • 想法#1是不言自明的
  • @SertacAkyuz 尽其所能详细说明了想法 #3,但缺少有关您的程序的信息。
  • @Ravaut123 详细介绍了想法 #4
  • 想法#2概述如下

假设您的“ADO 数据库”由 Microsoft Access 支持,并根据http://www.databasedev.co.uk/access-sql-string-functions.html ... 或使用 MS SQL 并根据http:// msdn.microsoft.com/en-us/library/ms177532.aspx ...或者...

Query.SQL.Text := 'select Right(Name, 4) as name_tail, * from table where ...'

查看添加到查询的额外列!4 是“约翰”的长度。

对于这样的查询,以下过滤条件是等效的:

  • Filter := ' [Name] like ''%john'' ';
  • 过滤器 := ' [name_tail] = ''约翰'' ';

但是,如果在某些行上 Name 列短于 4 个字母,我不知道 RIGHT 函数会做什么。也许它会截断结果,或者抛出错误并中止查询。后者可能 - 取决于真实数据 - 可能可以通过用空格填充到 4 长度来缓解,比如

LTrim(Right('    ' || Name, 4)) as name_tail

那是供您测试的,因为只有您知道环境的详细信息。

于 2012-09-12T11:03:04.567 回答