MS Access 无法从部分记录中检索数据(SQL 中的错误或错误?)

问题描述 投票:0回答:1

我损失了大约半天时间,几乎要疯了!

有问题的数据库只有 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”……

sql ms-access null user-defined-functions recordset
1个回答
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()。

© www.soinside.com 2019 - 2024. All rights reserved.