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