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

时间:2016-08-24 18:21:18

标签: sql access-vba ms-access-2010

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

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

在选择序列号后,我需要文件单元号组合框来填充选项,并在每次后续选择的子序列号时更新,只显示文件单位表中与所选值匹配的文件单元号并且为null未选择任何内容的子系列组合框的值。

我写了一个子程序,当用户在满足某些条件时退出每个组合框后调用该子程序。在子过程中,如果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之外的所有内容)并测试然后项目填充我的文件单元组合框。问题是这些数字都是文件单元号,与所有子系列列中的值无关。

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

2 个答案:

答案 0 :(得分:1)

在你的代码中有一些弱点(并且做了什么建议:在执行之前检查生成的代码!)

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

  • paranthesis应包含完整的表达式AND (FileUnit.Subseries_4_Number=123)。您可以完全放弃它们,因为只有AND个。

  • 并检查空白:

    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

(如果您的变量仅包含值,请查看paranthesis,AND之前缺少的空白和缺失的=

UPDATE注意sql注入!

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

答案 1 :(得分:1)

抱歉浪费任何人的时间!我自己整理了答案。事实证明,有些字段不是NULL而是空字符串。当没有值时,我将保存的字符串更改为变量:

  

[table] .field IS NULL或[table] .field =“”