Recordset过滤器的问题

时间:2009-10-02 17:24:48

标签: asp-classic vbscript filter ado recordset

我在传统的ASP Classic代码中使用ADO Recordset上的过滤器时遇到问题,而我正在尝试了解我是否不支持我要做的事情,或者我是否只是做错了。

我有一个Items记录集,它们的状态为1(活动)或0(非活动),以及可选的End_Date。在我的管理用户界面中,我有一个控件来显示所有项目或仅显示应向最终用户显示的项目:Status = 1 AND ( End_Date is null OR End_Date > Date() )

为了实现这个逻辑,我尝试了:

rs.Filter = "Status = 1 AND ( End_Date = null OR End_Date > #" & Date() & "# )"

但我得到

ADODB.Recordset (0x800A0BB9)
Unknown runtime error

经过多次愚弄之后,似乎ADO不喜欢End_Date条件下的分组parens与AND条件相结合。如果我把parens拿出来,这可行:

rs.Filter = "Status = 1 AND End_Date = null OR End_Date > #" & Date() & "#"

但这只是一个意外 - 看起来过滤条件按顺序进行评估,所以我得到了我想要的结果。如果我将AND更改为OR,则parens工作:

rs.Filter = "Status = 1 OR ( End_Date = null OR End_Date > #" & Date() & "# )"

但当然这种逻辑是错误的 - 它显示了活动但过期的项目。

奇怪的是,如果我移动条件,它会再次破裂:

rs.Filter = "End_Date = null OR Status = 1 AND End_Date > #" & Date() & "# "

崩溃并出现相同的ADODB错误。

我似乎无法预测将会发生什么作用,哪些行不通,而且我所阅读的文档在预期的语法上非常粗略(它不是纯粹的T-SQL!),限制等等等等等等等等等等等等等。我见过的例子最多有两个条件。我认为我的条件并不复杂。任何人都可以告诉我,如果有更好的方法可以支持我是否支持,或者指向我那些符合这种逻辑的综合文档和样本?

谢谢!

4 个答案:

答案 0 :(得分:5)

ADO Recordset Object Filter Property

  

AND和OR之间没有优先权。子句可以在括号内分组。但是,您不能将OR加入的子句分组,然后将该组加入另一个带AND的子句,如下所示:

     

(LastName ='Smith'或LastName =   '琼斯')和FirstName ='约翰'

     

相反,你会构建这个   过滤为:

     

(LastName ='Smith'AND FirstName =   '约翰')或

     

(LastName ='Jones'AND FirstName =   '约翰')

所以你必须像这样构建你的过滤器:

rs.Filter = "( Status = 1 AND End_Date = null ) OR ( Status = 1 AND End_Date > #" & Date() & "# )"

答案 1 :(得分:0)

您可能会对此文章感兴趣:PRB: Cannot Filter ADO Recordsets for Nulls

答案 2 :(得分:0)

我知道您正在使用遗留代码,可能还有其他工作正在运行,但是如何在此特定页面中打开记录集?你在adovbs.inc中使用了一些常量吗?

例如:

rs.Open "SELECT * FROM table1", db, adOpenStatic, adLockPessimistic

答案 3 :(得分:0)

尝试此操作会发生什么......

Dim strToday
strToday = Now()
rs.Filter = "Status=1 AND (End_Date = null OR End_Date > """ & strToday & """)"