TADOQuery过滤器和表达式始终为true

时间:2010-01-12 14:10:24

标签: delphi filter delphi-2009 ado tadoquery

我正在尝试从TADOQuery中过滤一些记录。我将filtered属性设置为true,当我将过滤器设置为field ='value'时,一切正常。我想通过附加

动态构建此过滤器
<space>AND field='value'

一个值总是为真,我认为1 = 1就可以了。所以我会将1 = 1作为默认过滤器,然后根据需要添加AND field='value'

然而,这不起作用。错误消息显示为:

  

参数类型错误,超出可接受的范围,或彼此冲突。

有谁能告诉我,我可以使用什么作为这个过滤器的多功能始终真实的表达?

3 个答案:

答案 0 :(得分:1)

我想不言而喻,但这取决于OLE DB提供程序是否有效。当您在现有记录集上设置过滤器时,它最终会通过不同的OLE DB接口(如果我没记错,则为IViewFilter)。因此,即使过滤器在SQL语句的WHERE子句中工作,也不一定意味着它将用作过滤器。您设置的过滤器最终被解析为组件,然后传递给OLE DB接口。可能是提供者的实现不期望形式为“constant = constant”的过滤器。作为一种变通方法,您可以尝试在SQL语句的WHERE子句中进行全部设置。

答案 1 :(得分:1)

如果您没有过滤某些内容,则必须将“Filtered”属性设置为False,并在需要过滤结果集时将其设置为True和条件。

我会动态构建正确的SQL属性,以便您始终确切地知道发送到数据库的内容(并确保您的程序只接收您想要的那些记录)。

答案 2 :(得分:1)

1 = 1技巧在查询的where子句中正常工作,但在过滤属性中没有。如果要禁用过滤器,请将filtered设置为false,并返回所有记录。

过滤的问题在于它是在客户端完成的。如果您正在使用SQL Server等数据库引擎并希望过滤大量记录,则可以通过更改SQL查询来更好地服务,这将允许数据库服务器仅返回请求的记录。只需记住先关闭TAdoQuery,然后更改SQL然后重新打开。

我用来避免返回整个数据集(用于大型数据集)的技巧是考虑我想要显示的最大记录数,然后使用TOP SQL语法返回的数量超过我想要的记录数显示'n'...如果我达到该数字,那么我通知用户返回的记录超过n-1并调整搜索/过滤条件。