MS Access部分记录读取异常:是SQL问题还是软件Bug?
Access记录集字段读取异常问题排查
背景
涉事数据库大小仅88.5MB,包含815921条气象数据(1个日期字段+13个十进制数字字段)。VB代码可正常处理95%的记录,但约5%的记录无法被正确提取和读取。
前置操作:先通过查询表单筛选出4个字段均为NOT NULL的记录,得到262308条数据,再通过VB代码基于这4个非空字段计算新变量(例如调用带[Chrono]参数的Nord—()函数生成N字段)。
核心问题
尽管查询结果仅包含无NULL值的记录,但在对应的记录集中,除用于检索的日期字段外,其余字段多被识别为NULL值。
例如某测试记录:在查询表单中显示[Rafale°]值为236,但代码读取该字段时却为NULL,导致流程出错(目标记录已被成功检索,CT.EOF不为真)。
相关VB代码
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 ''' 此处触发,但数据库中[Rafale°]实际为236 ''' Case Else SO_Test = 0 End Select CT.MoveNext Wend CT.Close End Function
注:代码中原SO_Test—为笔误,已修正为SO_Test
尝试过的无效方案
- 执行3次“压缩和修复数据库”,问题未解决
- 将数据导出至Excel,转为文本后再转回日期/数字格式重新导入Access,测试记录的"236"仍被识别为NULL
偶然生效的解决方案
在SQL查询中添加额外条件后,问题消失:
-- 原语句(失败) & "#;", dbOpenDynaset) -- 修改后语句(正常) & "# AND [Rafale°] > 0;", dbOpenDynaset)
修改后该记录可被正确检索,CT![Rafale°]值读取为236。
疑问
这是MS Access的Bug,还是我在SQL代码中忽略了重要细节?
注:未添加额外条件时,95%的记录均可被正确检索并读取所有值。
内容的提问来源于stack exchange,提问作者Bughater
相关产品推荐
相关产品推荐

