代码之家  ›  专栏  ›  技术社区  ›  Peter Perháč

tadoquery筛选器和表达式始终为true

  •  0
  • Peter Perháč  · 技术社区  · 14 年前

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

    <space>AND field='value'
    

    对于一个始终为真的值,我认为1=1可以做到这一点。所以我将1=1作为默认过滤器,然后附加 AND field='value' 在必要的时候。

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

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

    有谁能告诉我,我能用什么来表达这个过滤器的多才多艺,永远都是真的吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Mark Wilkins    14 年前

    我想不用说,但这取决于OLEDB提供程序是否工作。当您在现有记录集上设置过滤器时,它最终会通过另一个OLE DB接口(如果我记得正确,则为IViewFilter)。因此,即使过滤器在SQL语句的WHERE子句中工作,也不一定意味着它将作为过滤器工作。您设置的过滤器最终被分解成组件块,然后传递到ole db接口。可能是提供程序的实现不希望使用“constant=constant”形式的筛选器。作为解决方法,您可以尝试在SQL语句的WHERE子句中全部设置。

        2
  •  1
  •   Edelcom    14 年前

    如果不筛选某些内容,则必须将“filtered”属性设置为false,并在希望筛选结果集时将其设置为true和条件。

    不过,我会动态地构建正确的SQL属性,这样您就可以始终准确地知道发送到数据库的是什么(并且您确信您的程序只接收您想要的那些记录)。

        3
  •  1
  •   skamradt    14 年前

    1=1技巧在查询的WHERE子句中工作正常,但在筛选属性中不起作用。如果要禁用筛选,请将filtered设置为false,将返回所有记录。

    过滤的问题在于它是在客户端完成的。如果您使用的是像SQL Server这样的数据库引擎,并且希望筛选一组大的记录,那么最好更改SQL查询,这样数据库服务器只返回请求的记录。只需记住先关闭tadoquery,更改SQL,然后重新打开。

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