【问题标题】:TADOQuery filter and an expression always trueTADOQuery 过滤器和表达式始终为真
【发布时间】:2010-01-12 14:10:23
【问题描述】:

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

来动态构建这个过滤器
<space>AND field='value'

到一个始终为真的值,我认为 1=1 可以解决问题。所以我会将 1=1 作为默认过滤器,然后根据需要将 AND field='value' 附加到它。

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

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

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

【问题讨论】:

    标签: delphi filter delphi-2009 ado tadoquery


    【解决方案1】:

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

    【讨论】:

    • 感谢您的洞察力。我想它会是这样的(超出我的理解范围;))。我决定根本不用担心第一个“ AND ”,在应用过滤器之前,我删除了前五个字母,如下所示:filter := copy(filter,5,length(filter)-4);
    • 您的意思是删除前 4 个字符,不是吗?你可以把它写成filter := Copy(filter,5,MaxInt)(你不需要 Length(...) 部分。
    • 我没有?谢谢。休息几年后回到德尔福:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-10
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 2020-04-09
        • 1970-01-01
        相关资源
        最近更新 更多