我在使用旧版 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!)、限制等以及我的所有示例都非常粗略。见过最多两个条件。我不认为我的条件那么复杂。谁能告诉我是否支持我正在尝试做的事情,是否有更好的方法,或者向我指出与这种逻辑相匹配的综合文档和示例?
谢谢!