1

我在使用旧版 ASP 经典代码中的 ADO 记录集上的过滤器时遇到了问题,我试图了解我正在尝试做的事情是否不受支持,或者我只是做错了。

我有一个项目记录集,它们的状态为 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 条件与 AND 条件结合使用的分组括号。如果我把括号拿出来,这行得通:

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

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

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

3 回答 3

7

ADO 记录集对象过滤器属性

AND 和 OR 之间没有优先级。子句可以在括号内分组。但是,您不能对通过 OR 连接的子句进行分组,然后使用 AND 将该组连接到另一个子句,如下所示:

(姓氏 = '史密斯' 或姓氏 = '琼斯')和名字 = '约翰'

相反,您可以将此过滤器构造为:

(姓氏 = 'Smith' AND FirstName = 'John')或

(姓 = '琼斯' 和名字 = '约翰')

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

rs.Filter = "( Status = 1 AND End_Date = null ) OR ( Status = 1 AND End_Date > #" & Date() & "# )"
于 2009-10-23T19:49:06.910 回答
0

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

例如:

rs.Open "SELECT * FROM table1", db, adOpenStatic, adLockPessimistic
于 2009-10-21T16:57:33.787 回答
0

当你尝试这个时会发生什么......

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

于 2009-10-25T02:38:54.730 回答