我损失了大约半天时间,几乎要疯了!
有问题的数据库只有 88.5 MB,但包含 815921 条记录(天气数据:1 个日期字段 + 13 个十进制数字字段)。 我的 VB 代码无法提取和读取大约 5% 的记录,尽管其中大多数记录都得到了正确处理 -
首先通过查询表单提取所需数据,要求其中 4 个字段为 NOT NULL。这给出了一组 262308 条记录。从那里,查询表单通过 VB 代码从 4 个 NOT NULL 字段计算新变量(例如 N: Nord—([Chrono] 使用 [Chrono] 参数调用 Nord—() 函数)。
问题:虽然查询仅包含记录而没有 NULL 值,但其记录集包含许多记录,除了用于检索它们的日期字段之外,这些记录仅包含 NULL 字段。
代码如下:
Function SO_Test(ByVal Chrono) As Single
Dim db As Database, CT As Recordset, Durée As Single
Set db = CurrentDb()
Set CT = db.OpenRecordset("SELECT * " _
& "FROM [MesuresOK] WHERE [Chrono] = #" _
& Format(Chrono, "m\/d\/yyyy hh:mm:ss") _
& "#;", dbOpenDynaset)
While Not CT.EOF
Select Case CT![Rafale°]
Case 181 To 269
SO_Test— = Vecteur(225, CT![Rafale°]) * CT![Rafale] * Durée
Case NULL
Stop ''' here we land though [Rafale°] = 236 in the database '''
Case Else
SO_Test = 0
End Select
CT.MoveNext
Wend
CT.Close
End Function
请注意,所需的测试记录已成功检索(CT.EOF 不为 NULL),但 VT![Rafale°] 和 VT![Rafale°] 均为 NULL,导致后续过程出错。在查询表单上看到的该记录的值为 236,它应该是。
“压缩和修复”数据库(~3×)没有帮助。然后,我怀疑是否存在非打印字符等,并将数据导出到 MS Excel,首先将所有内容转换为文本,然后返回日期和数字,最后再次将所有数据导入回 MS Access。没有成功,该测试记录的值“236”仍然被解释为NULL!
最后,我偶然发现,当向 SQL 查询添加一个条件时,问题就消失了(希望是永久的):
''''' & "#;", dbOpenDynaset) ''''' fails
& "# AND [Rafale°] > 0;", dbOpenDynaset) ''''' OK
现在该记录已正确检索,CT![Rafale°] 为 236 .
这是一个错误还是我监督了 SQL 代码中的某些重要内容?
请记住,95%的记录及其所有值都可以正确检索,无需附加条件“ AND [Rafale°] > 0”……
好的,当然,对于“null”值,您的 case 语句的表达式将无法正确计算。
换句话说,在VBA代码中,你不能使用也不能去
CT!SomeColumn = null
因此,空表达式被视为“无效”表达式。
所以,有了上面的内容,你就可以说使用
isnull(CT!SomeColumn) = true
因此,在您的情况下,如果您要使用 case 语句,则必须测试或“转换”空表达式。
因此,我建议使用这段代码:
While Not CT.EOF
Select Case Nz(CT![Rafale°], "")
Case 181 To 269
SO_Test— = Vecteur(225, CT![Rafale°]) * CT![Rafale] * Durée
Case ""
' column is null or emptry ""
Stop ''' here we land though [Rafale°] = 236 in the database '''
Case Else
SO_Test = 0
End Select
CT.MoveNext
Wend
CT.Close
因此,即使没有 Select Case 语句,您也永远不会使用
If CT![Rafale°] = null then -- NOT ALLOWED
你必须使用
If isnull(CT![Rafale°]) then
或者,你可以使用 say
if nz(CT![Rafale°],"") = "" then
因此,Select Case 语句实际上是在一系列简单的“if/then”语句后面,因此,您需要使用有效的表达式,其中“some expression = null”绝不是有效的表达式。
除了上述规则之外唯一真实的?
在编写SQL语句时,可以这样做:
select ID, FirstName FROM tblPeople WHERE FirstName Is Null
但是,在VBA代码中呢?您根本无法使用“某些表达式 = null”的标准逻辑比较,但需要使用 nz() 或 isnull()。