【问题标题】:How to avoid "Type mismatch in expression" in ClientDataSet Filter如何避免 ClientDataSet 过滤器中的“表达式中的类型不匹配”
【发布时间】:2013-05-27 21:27:31
【问题描述】:

运行此代码时出现错误消息“表达式中的类型不匹配”:

CDSIndicados.Filtered := False;
CDSIndicados.Filter   := 'EDICOES_ID like ' + QuotedStr(IntToStr(Integer(cxComboBox1.Properties.Items.Objects[cxComboBox1.ItemIndex])));
CDSIndicados.Filtered := True;

我知道当字段的数据类型有错误时,可能会出现此消息。但我无法修复。是这样吗?

【问题讨论】:

  • 如果我在调试它,我会首先检查分配给 CDSIndicados.Filter 的值,然后开始推理。
  • 您不能将错误追溯到 dbcommon.pas 以了解实际原因吗?

标签: delphi filter tclientdataset


【解决方案1】:

我怀疑您的 EDICOES_ID 字段是一个整数值,在这种情况下,您不需要在过滤器表达式中引用它,并且 LIKE 运算符不受 AFAIK 支持。如果它是一个字符串字段,您确实需要引号并且支持LIKE,但您通常也需要在表达式中使用通配符。 (LIKE 仅支持字符(字符串)类型字段。对于数字或日期,您需要使用常用的比较运算符 >、=、 或之间。)

也帮自己一个忙,声明一个局部变量,并确保在尝试访问其Objects 之前确实在ComboBox 中选择了一个项目。我已经为 ItemIndex 和您正在检索的类型转换 Object 的中间存储添加了一个,如果您需要这样做,调试起来会容易得多。

这里有一个解决方案(无论是整数字段,还是需要引用的字符串)。

var
  Idx, Value: Integer;
begin
  Idx := ComboBox1.ItemIndex;
  if Idx > -1 then
  begin
    CDSIndicados.Filtered := False;
    Value := Integer(cxComboBox1.Properties.Items.Objects[Idx]);

    // If the field is an integer, you don't need a quoted value,
    // and LIKE isn't supported in the filter.
    CDSIndicados.Filter   := 'EDICOES_ID = ' +  IntToStr(Value);

    // Not relevant here, but LIKE isn't supported for date values
    // either. For those, use something like this
    CDSIndicados.Filter := 'EDICOES_DATE = ' + QuotedStr(DateToStr(Value));

    // or, if the field is string and you want LIKE, you need to
    // quote the value and include a wildcard inside that quoted 
    // string.
    CDSIndicados.Filter := 'EDICOES_ID LIKE ' + QuotedStr(IntToStr(Value) + '%');
    CDSIndicados.Filtered := True;
  end;
end;

【讨论】:

  • 感谢您的提示。我已经确定在 ComboBox 中选择了一个项目。我进行了建议的更改,但问题仍然存在。可能是某个字段的数据类型有问题,我会继续寻找我的错误。
  • Ken 描述的问题是您可能在过滤器中使用了带引号的整数值(通过使用QuotedStr)。整数值不喜欢那样。 [+1]
  • 是的,我已经纠正了这个错误。但是“表达式类型不匹配”的消息不断出现。
  • 查看我的编辑(如果这不能解决您的问题,请提供EDICOES_ID 列的数据类型)。
  • 现在可以了。 EDICOES_ID 是一个整数列。我将EDICOES_ID like 更改为EDICOES_ID =,效果很好。谢谢。
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 2016-03-16
相关资源
最近更新 更多