You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access VBA中SQL无匹配记录时日期仍显示12:00:00 AM问题排查

问题:无匹配记录时仍显示默认日期12:00:00 AM

编写了一条基于键值查询信息的SQL语句,当记录数>0时提取日期等相关信息。但针对特定人员,因无匹配记录进入Else分支,却仍显示12:00:00 AM日期,其他字段为空。以下是相关SQL及Access VBA代码,通过对象存储查询结果并传入调用,请问问题出在哪里?

相关VBA查询代码

strSQL = "SELECT ASSOCIATE.PERSONNEL_NUM, PART.PART_SSNO, PART.TAG, PART.DATE, PART.NOTES FROM PART INNER JOIN HASSOCIATE ON PART.PART_SSNO = ASSOCIATE.SSNO WHERE PART.PART_SSNO = " & strVar

Set rst= CurrentDb.OpenRecordset(strSQL)

 If rst.RecordCount > 0 Then
    objPartInfo.Tag= IIf(Len(Nz(rst!TAG, "")) > 0, Trim(rst!TAG), "0")
    objPartInfo.Date= IIf(Len(Nz(rst!DATE, "")) > 0, (rst!DATE), #12/31/9999#)
    objPartInfo.Notes = Trim(Nz(rst!NOTES, ""))

Else
    'do something
End If

更新表的SQL语句

strSQL = "UPDATE [TBLparticipants] " SET [TBLparticipants].[PartFrozenDate] = #" & objPartInfo.FrozenDate & "#, [TBLparticipants].[PartFrozen] = '" & objPartInfo.Frozen & "', [TBLparticipants].[PartFrozenNotes] = '" & apostrophe(objPartInfo.Notes) & "', WHERE [TBLparticipants].[PartSS#]= " & CLng(objPartInfo.SSNO)

问题原因分析

  • 对象属性未初始化:VBA中日期类型的默认值就是12:00:00 AM(对应#12/30/1899#),objPartInfo的日期属性在进入Else分支时没被显式赋值,默认值就会被带到后续的更新操作里。
  • Else分支逻辑缺失:当前Else分支没有对objPartInfo的日期等属性做清空或赋值Null的处理,导致默认日期保留。
  • 更新SQL语法错误:更新语句里PartFrozenNotes赋值后的逗号是多余的,会导致SQL执行失败。

解决方案

  1. 初始化对象属性:在执行查询前,先初始化objPartInfo的所有属性,避免默认值干扰:
objPartInfo.Tag = "0"
objPartInfo.Date = Null
objPartInfo.Notes = ""
objPartInfo.FrozenDate = Null
objPartInfo.Frozen = ""
  1. 完善Else分支处理:在无匹配记录时,显式设置日期属性为Null或指定空值:
Else
    objPartInfo.Tag = "0"
    objPartInfo.Date = Null ' 也可根据业务需求设置为特定空日期,比如#1/1/1900#
    objPartInfo.Notes = ""
    objPartInfo.FrozenDate = Null
    objPartInfo.Frozen = ""
End If
  1. 修复更新SQL的语法问题:删除多余逗号,并处理日期为Null的情况(Access SQL中日期字段赋值Null不能加#):
strSQL = "UPDATE [TBLparticipants] SET " & _
         "[PartFrozenDate] = " & IIf(IsNull(objPartInfo.FrozenDate), "Null", "#" & objPartInfo.FrozenDate & "#") & ", " & _
         "[PartFrozen] = '" & objPartInfo.Frozen & "', " & _
         "[PartFrozenNotes] = '" & apostrophe(objPartInfo.Notes) & "' " & _
         "WHERE [PartSS#] = " & CLng(objPartInfo.SSNO)

内容的提问来源于stack exchange,提问作者user16800302

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:39:54