Access中INSERT语句无法插入计算型日期时间列值求助
问题描述
表tMetroPicks的dtExpectIn列格式为"hh:nn",表单fBoard上的未绑定控件Me.nMAS03EI格式与之完全一致。使用以下INSERT语句时,其他所有列均能正常插入,唯独dtExpectIn列无法写入:
CurrentDb.Execute "INSERT INTO tMetroPicks (nPicker, nType, txRunNo, nLines, nBulk, nPrimary, dtTimeOut, dtExpectIn, dtActualIn, nPickHrs, nPickRate, nWeight) VALUES ('" & Me.nPICK03 & "', '" & Me.nM03PT & "', '" & Me.MAS03 & "', '" & Me.nM03TL & "', '" & Me.nM03BL & "', '" & Me.nM03PL & "', '" & Me.nM03TO & "', '" & Me.nM03EI.Value & "', '" & Me.nM03AI & "', '" & Me.nM03PH & "', '" & Me.nM03PR & "', '" & Me.nM03KG & "')" DoCmd.RunCommand acCmdSaveRecord
nMAS03EI的值由以下公式生成(公式本身运行正常):
=IIF([nM03TO] = "", "", [nM03TO] + (([nM03TL] / 6.1) / 24))
补充信息:
dtTimeOut和dtActualIn同为时间类型列,但它们的值是手动输入的时间戳,而非计算值,插入无异常;nMAS03PL、nMAS03PH和nMAS03PR是计算型数值列,插入也正常;- 已为
nMAS03EI添加.Value消除歧义,怀疑是计算型日期时间列的特性导致插入失败。
解决方案
1. 改用参数化查询(最推荐)
字符串拼接日期/时间值极易因区域格式、空值处理等问题出错,参数化查询能彻底规避这类问题:
Dim qd As QueryDef Set qd = CurrentDb.CreateQueryDef("", _ "INSERT INTO tMetroPicks (nPicker, nType, txRunNo, nLines, nBulk, nPrimary, dtTimeOut, dtExpectIn, dtActualIn, nPickHrs, nPickRate, nWeight) " & _ "VALUES (@Picker, @Type, @RunNo, @Lines, @Bulk, @Primary, @TimeOut, @ExpectIn, @ActualIn, @PickHrs, @PickRate, @Weight)") ' 绑定参数,无需手动处理格式或引号 qd.Parameters("@Picker") = Me.nPICK03.Value qd.Parameters("@Type") = Me.nM03PT.Value qd.Parameters("@RunNo") = Me.MAS03.Value qd.Parameters("@Lines") = Me.nM03TL.Value qd.Parameters("@Bulk") = Me.nM03BL.Value qd.Parameters("@Primary") = Me.nM03PL.Value qd.Parameters("@TimeOut") = Me.nM03TO.Value qd.Parameters("@ExpectIn") = Me.nM03EI.Value qd.Parameters("@ActualIn") = Me.nM03AI.Value qd.Parameters("@PickHrs") = Me.nM03PH.Value qd.Parameters("@PickRate") = Me.nM03PR.Value qd.Parameters("@Weight") = Me.nM03KG.Value qd.Execute dbFailOnError Set qd = Nothing
2. 修正空值处理逻辑
原公式中当nM03TO为空时返回空字符串,但日期/时间列需要的是Null而非空字符串,修改公式:
=IIF([nM03TO] Is Null, Null, [nM03TO] + (([nM03TL] / 6.1) / 24))
或在VBA插入前做判断转换:
Dim expectInVal As Variant If IsNull(Me.nM03EI.Value) Or Me.nM03EI.Value = "" Then expectInVal = Null Else expectInVal = Me.nM03EI.Value End If
3. 确认控件数据类型
右键控件nMAS03EI,查看“数据类型”是否为日期/时间。即使显示格式是hh:nn,若控件本身是文本类型,插入时会因类型不匹配失败。
内容的提问来源于stack exchange,提问作者n00dnutt
相关产品推荐
相关产品推荐

