在 Select 语句中使用 "IS NULL" 访问 2010 年问题

Access 2010 Issues with "IS NULL" in Select statement

我是一名新手程序员,试图在 Access 2010 中构建工作数据库,以便更好地管理我们的数据。我们的归档系统涉及在各种分支主题中相互嵌套的文件。分支的长度各不相同,在我的数据库中,每条记录总是有一个集合号、系列号和文件单元号,但有几个子系列号,它们可能有也可能没有,具体取决于前一个分支的主题数量学科。所有这些信息都收集在文件单元 table.

我正在设置一个搜索表单,其中包含一个组合框,用于收集编号、系列编号、每个可能的子系列编号,然后是文件单位编号,以便用户从第一个组合框中选择他们的收集编号然后触发一个查询,用该系列号可用的所有系列号填充系列组合框,依此类推。我的问题是文件单元号组合框。

我需要文件单元号组合框在选择系列号后填充选项,并在每次后续选择子系列号时更新以仅显示匹配的文件单元 table 中的文件单元号选定的值,并且对于未选择任何内容的子系列组合框具有空值。

我编写了一个子过程,当满足特定条件时,它会在用户退出每个组合框后调用。在子过程中,if then 语句检查每个组合框,如果有值,则将其存储在相应的字符串变量中,如果没有,则将变量设置为 IS NULL。

这是我用来填充文件单元号组合框的代码:

File_Unit_Number.RowSourceType = "Table/Query"

File_Unit_Number.RowSource = "SELECT File_Unit.File_Unit_Number,
File_Unit.File_Unit_Name FROM File_Unit WHERE
(((File_Unit.Collection_Number) " & cmbCollection & " AND
(File_Unit.Series_Number) " & cmbSeries & "
AND(File_Unit.Subseries_1_Number) " & cmbSubseries_1 & "
AND(File_Unit.Subseries_2_Number) " & cmbSubseries_2 & "
AND(File_Unit.Subseries_3_Number) " & cmbSubseries_3 & "
AND(File_Unit.Subseries_4_Number) " & Subseries_4 & "
AND(File_Unit.Subseries_5_Number) " & cmbSubseries_5 & "));"

我已经 运行 测试以确保我的 if-then 语句正确触发并且 SQL 字符串正确打印。当我从语句的 WHERE 部分删除具有空值的字段(即删除 series_number 以外的所有内容)并进行测试时,项目将填充我的文件单元组合框。问题是这些数字是所有文件单元编号,无论所有子系列列中的值如何。

我做错了什么?有没有更简单的方法来获得我需要的结果?

您的代码中存在一些弱点(按照 sstan 的建议:在执行前检查生成的代码!)

  • 如果值不为空,你的变量是什么?如果我理解正确,您将文本 "IS NULL" 存储在变量中。如果有一个值,你的变量应该包含类似 "='SomeValue'" 的内容(注意字符串,必须在引号中,格式如 ., 小数或日期时间文字)

  • 括号应包括完整的表达式 AND (FileUnit.Subseries_4_Number=123)。您可能会完全放弃它们,因为只有 ANDs.

  • 并检查空格:

    AND(File_Unit.Subseries_1_Number) " & cmbSubseries_1 & " AND(File_Unit.Subseries_2_Number) " & cmbSubseries_2 & "

...可能会导致

AND(File_Unit.Subseries_1_Number) ISNULLAND(File_Unit.Subseries_2_Number) 123

(看看括号,AND 之前缺少的空格和缺少的 = 如果您的变量只携带值。

更新当心sql注入!

无论如何 SQL 不应通过连接字符串来创建具有值的语句,而应使用参数...

抱歉浪费大家的时间!我自己整理了答案。原来有些字段不是NULL而是空字符串。我将没有值时保存到变量的字符串更改为:

[table].field IS NULL or [table].field = ""