MS-Access 更新 SQL 不为空但为空(!日期和数字字段!)
MS-Access Update SQL Not Null But is Blank (! Date & Number Fields !)
我的 table 中有一些数字和短日期格式的控件,日期控件也被屏蔽为 mm/dd/yyyy。加载到表单中的一些字段在原始 table 中是空白的,因此在执行 sql 时,我实际上是在评估错误的事情,无论我检查的是 '' 还是 Null。因为 '' 作为日期数字的文本失败并且字段实际上不是空白。
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 方法而不是 =''
也会失败
我没有粘贴日期失败的示例,但想法相同,不是空而是空白,但似乎无法再次更新回空白甚至可能跳过?
在此先感谢大家。
尝试 Erik Von Asmuth 代码的 Update-1 <--谢谢顺便说一句!
Set qdf = db.CreateQueryDef("", & _
"UPDATE [tblDetails] SET " & _
"[Proposed] = @Proposed, " & _
"[Multi] = @Multi, " & _
"[Rational] = @Rational " & _
"WHERE [RNumber] = @RNumber")
这部分全是红色,关闭通知后第一个“&”高亮显示window
编译错误:
预期:表达式
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;_。
您应该考虑空字符串,并在 VBA 中执行 IIF
语句而不是 SQL:
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
我的 table 中有一些数字和短日期格式的控件,日期控件也被屏蔽为 mm/dd/yyyy。加载到表单中的一些字段在原始 table 中是空白的,因此在执行 sql 时,我实际上是在评估错误的事情,无论我检查的是 '' 还是 Null。因为 '' 作为日期数字的文本失败并且字段实际上不是空白。
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 方法而不是 =''
也会失败我没有粘贴日期失败的示例,但想法相同,不是空而是空白,但似乎无法再次更新回空白甚至可能跳过?
在此先感谢大家。
尝试 Erik Von Asmuth 代码的 Update-1 <--谢谢顺便说一句!
Set qdf = db.CreateQueryDef("", & _
"UPDATE [tblDetails] SET " & _
"[Proposed] = @Proposed, " & _
"[Multi] = @Multi, " & _
"[Rational] = @Rational " & _
"WHERE [RNumber] = @RNumber")
这部分全是红色,关闭通知后第一个“&”高亮显示window 编译错误: 预期:表达式
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;_。
您应该考虑空字符串,并在 VBA 中执行 IIF
语句而不是 SQL:
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