0

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

<space>AND field='value'

到一个值总是正确的,我认为 1=1 就可以了。所以我将 1=1 作为默认过滤器,然后AND field='value'根据需要附加到它。

但是,这不起作用。错误消息如下:

参数类型错误、超出可接受范围或相互冲突。

谁能告诉我我可以用什么作为这个过滤器的通用永远为真表达式?

4

3 回答 3

1

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

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

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

于 2010-01-12T17:33:30.900 回答
1

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

于 2010-01-12T14:32:10.283 回答
1

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

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

于 2010-01-12T14:33:44.400 回答