【问题标题】:MS-Access Update SQL Not Null But is Blank (! Date & Number Fields !)MS-Access 更新 SQL 不为空但为空(!日期和数字字段!)
【发布时间】:2018-04-07 10:47:00
【问题描述】:

我的表格中有一些数字和短日期格式的控件,日期控件也被屏蔽为 mm/dd/yyyy。加载到表单中的某些字段在原始表中是空白的,因此在执行 sql 时,我本质上是在评估错误的事情,无论是检查“”还是 Null。 as '' 作为日期编号的文本失败,并且这些字段实际上不是空白的。

        strSQL4 = "UPDATE [tblDetails] SET " & _
            "[Proposed] = IIF(IsNull(" & Forms!frmEdit.txtProposed.Value & "),0," & Forms!frmEdit.txtProposed.Value & "), " & _
            "[Multi] = IIF(IsNull(" & Forms!frmEdit.txtMulitplier.Value & "),0," & Forms!frmEdit.txtMulitplier.Value & "), " & _
            "[Rational] = '" & Forms!frmEdit.txtRational.Value & "' " & _
            " WHERE [RNumber] = '" & Forms!frmEdit.cmbUpdate.Value & "'"
            Debug.Print strSQL4
        dbs.Execute strSQL4

ERROR 3075 查询表达式中函数使用的参数数量错误 'IIF(IsNull(),0,'

我也尝试输入从另一个站点建议的字段本身

        strSQL4 = "UPDATE [tblDetails] SET " & _
            "[Proposed] = IIF(" & Forms!frmEdit.txtProposed.Value & "='',[Proposed]," & Forms!frmEdit.txtProposed.Value & "), " & _
            " WHERE [RNumber] = '" & Forms!frmEdit.cmbUpdate.Value & "'"
            Debug.Print strSQL4
        dbs.Execute strSQL4

同样的错误 3075 'IIF(IsNull(),0,[ProposedHrs]'

***如果我使用 IIF(IsNull 方法而不是 =''

也会失败

我没有粘贴日期失败的示例,但想法相同,不是 null 而是空白,但似乎无法再次更新回空白甚至跳过?

在此先感谢大家。

来自尝试 Erik Von Asmuth 代码的 Update-1

Set qdf = db.CreateQueryDef("", & _
            "UPDATE [tblDetails] SET " & _
            "[Proposed] = @Proposed, " & _
            "[Multi] = @Multi, " & _
            "[Rational] = @Rational " & _
            "WHERE [RNumber] = @RNumber")

这部分全为红色,关闭通知窗口后第一个“&”高亮 编译错误: 预期:表达式

Update-2:我将更新移到第一行,它似乎正在工作。设置 qdf = db.CreateQueryDef("", "UPDATE [tblDetails] SET " & _

接下来我将在日期字段中尝试这种方法。

Update-3:当尝试使用带有 99/99/0000;0;_ 掩码的文本框进行相同的参数化时,我收到的项目未在集合中找到?我已经检查了几次拼写,一切似乎都很好。我尝试了以下三种格式,因此设置了参数 DateRcvd,任何人都可以评论这对于带有日期的文本框是否正确?

qdf.Parameters("@DateRcvd") = IIf(Nz(Forms!frmEdit.txtDateRcvd.Value) = "", 0, Forms!frmEdit.txtDateRcvd.Value)
qdf.Parameters("@DateRcvd") = IIf(IsNull(Forms!frmEdit.txtDateRcvd.Value), 0, Forms!frmEdit.txtDateRcvd.Value)
qdf.Parameters("@DateRcvd") = IIf(Forms!frmEdit.txtDateRcvd.Value = "", 0, Forms!frmEdit.txtDateRcvd.Value)

更新 4:

Dim qdf2 As DAO.QueryDef
Set db = CurrentDb
Set qdf2 = db.CreateQueryDef("", "UPDATE [tblDetails] SET " & _
             "[DateReceived] = @DateRcvd " & _
             "WHERE [RNumber] = @RNumber")
             qdf.Parameters("@DateRcvd") = IIf(Nz(Forms!frmEdit.txtDateRcvd.Value) = "", 0, Forms!frmEdit.txtDateRcvd.Value)
             qdf.Parameters("@RNumber") = Forms!frmEdit.cmbUpdate.Value
             qdf2.Execute

请注意文本框 txtDateRcvd 在文本框的属性中设置了输入掩码 99/99/0000;0;_。

【问题讨论】:

  • 请提供您的新问题的查询(您似乎没有指定参数,并且您正在设置相同的参数@DateRcvd 3次)。另请注意,99/99/0000;0; 是无效日期(该日期的每一部分都无效)。 Access 中的最低可用日期是01-01-0100 00:00
  • 您在此处设置qdf2Set qdf2 = db.CreateQueryDef,但随后您将更改qdf 上的参数,而不是qdf2。那是你的错误。请注意,如果您将 0 插入日期字段,则会转换为 30-12-899。您可以改用 Null 将其留空
  • 我不相信我可以投票赞成您的评论,因为您已经回答了主要问题。但这是另一个 +1,因为更改参数 qdf revference 是正确的!也使用 Null 而不是 0。Everyting 现在很好用,谢谢。

标签: sql vba date ms-access number-formatting


【解决方案1】:

您应该考虑空字符串,并在 VBA 而不是 SQL 中执行 IIF 语句:

        strSQL4 = "UPDATE [tblDetails] SET " & _
        "[Proposed] = " & IIF(Nz(Forms!frmEdit.txtProposed.Value) = "",0,  Forms!frmEdit.txtProposed.Value) & ", " & _
        "[Multi] = " & IIF(Nz(Forms!frmEdit.txtMulitplier.Value) = "",0, Forms!frmEdit.txtMulitplier.Value) & ", " & _
        "[Rational] = '" & Forms!frmEdit.txtRational.Value & "' " & _
        " WHERE [RNumber] = '" & Forms!frmEdit.cmbUpdate.Value & "'"

或者更好的是,正确执行并参数化整个更新,这样就不会出现此类错误或 SQL 注入。

如何正确执行的示例:

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.CreateQueryDef("",  _
    "UPDATE [tblDetails] SET " & _
    "[Proposed] = @Proposed, " & _
    "[Multi] = @Multi, " & _
    "[Rational] = @Rational " & _
    "WHERE [RNumber] = @RNumber" 
)
qdf.Parameters("@Proposed") = IIF(Nz(Forms!frmEdit.txtProposed.Value) = "",0,  Forms!frmEdit.txtProposed.Value)
qdf.Parameters("@Multi") = IIF(Nz(Forms!frmEdit.txtMulitplier.Value) = "",0, Forms!frmEdit.txtMulitplier.Value)
qdf.Parameters("@Rational") = Forms!frmEdit.txtRational.Value
qdf.Parameters("@RNumber") = Forms!frmEdit.cmbUpdate.Value
qdf.Execute

【讨论】:

  • 感谢您的及时回复!我正在尝试实施您的解决方案,但不断收到编译错误:预期:表达式然后突出显示红色代码并专注于第一行 & 在线 db.CreateQueryDef("", & _
  • 请提供您使用的线路和实现。
  • 我将代码添加到原始帖子...... stackoverflow 评论框将不允许多个“@”,因为它认为我正在尝试通知多个先前的评论者。我明白 "", & _ 是空白 Name , space ,继续下一行,我从你的帖子中复制/粘贴了这一行,它仍然抛出错误?
  • 已编辑答案以避免该错误,请参阅当前编辑
  • 我对你的答案投了赞成票。谢谢。我还有其他方法可以标记您的回复吗?这是我在 Stackoverflow 上收到的第一个答案。我还添加了一个尝试在帖子中使用日期的问题,您能否告诉我您的解决方案是否可以修改或需要修改以处理日期?再次感谢真棒帮助。 :)
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 2018-04-15
  • 2017-05-13
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多