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执行失败。
解决方案
- 初始化对象属性:在执行查询前,先初始化
objPartInfo的所有属性,避免默认值干扰:
objPartInfo.Tag = "0" objPartInfo.Date = Null objPartInfo.Notes = "" objPartInfo.FrozenDate = Null objPartInfo.Frozen = ""
- 完善Else分支处理:在无匹配记录时,显式设置日期属性为Null或指定空值:
Else objPartInfo.Tag = "0" objPartInfo.Date = Null ' 也可根据业务需求设置为特定空日期,比如#1/1/1900# objPartInfo.Notes = "" objPartInfo.FrozenDate = Null objPartInfo.Frozen = "" End If
- 修复更新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
相关产品推荐
相关产品推荐

