【问题标题】:Passing an Empty/Null Date variable in VBA to an SQL UPDATE statement将 VBA 中的空/空日期变量传递给 SQL UPDATE 语句
【发布时间】:2014-07-03 17:23:49
【问题描述】:

我有一个带有各种文本框的 excel 用户表单,其中一些是输入日期的字段。然后用户可以保存他们的条目。

此时,我通过 ADO 连接连接到访问后端。用户输入的值传递给 SQL 字符串,例如

strSQL = "UPDATE tblDECONVERSION_DATA SET tblDECONVERSION_DATA.Status = '" & NewBusiness_WorkQueue.Decon_CaseStatus & "', " & _
        "tblDECONVERSION_DATA.DMS = '" & NewBusiness_WorkQueue.Decon_DMS & "', " & _
        "tblDECONVERSION_DATA.DateRecieved = #" & Format(NewBusiness_WorkQueue.Decon_DateRecieved, "mm/dd/yyyy") & "#, " & _
        "tblDECONVERSION_DATA.WireDate = #" & Format(NewBusiness_WorkQueue.Decon_WireDate, "mm/dd/yyyy") & "#, " & _
        "tblDECONVERSION_DATA.LastEditXID = '" & CurrUser & "', tblDECONVERSION_DATA.LastEditDate = #" & Now & "# " & _
        "WHERE (((tblDECONVERSION_DATA.CaseID)=" & ID & "));"

        adoRecSet.Open Source:=strSQL, ActiveConnection:=dbconnect, CursorType:=adOpenDynamic, LockType:=adLockOptimistic

但是,某些日期字段可以留空,例如 NewBusiness_WorkQueue.Decon_DateRecieved 变量为空。这会导致语法错误。如何在 VBA 和 access 数据库都接受的 SQL 语句中传递 Null 或 Empty 日期变量?

【问题讨论】:

  • 如果日期留空,那么您需要将该字段设置为“null”,但您不能在 # 中执行此操作。我会创建一个函数(例如“DateOrNull”)来检查日期输入并返回适当的 SQL。
  • 您是否遇到过存在日期并将其更新为 NULL 的情况?如果没有,您根本无法更新该字段。
  • @TimWilliams 感谢您的建议。我的实际 SQL 语句很长,最多可以包含 10 个日期变量。如果日期字段为 Null 或 Empty,有没有办法拥有一个大的 SQL 字符串并传递 null。或者如果用户输入了包含日期的变量?例如。 If IsDate(LastLogInTime) Then sqlVar = "#" & LastLogInTime & "#" 否则 sqlVar = "Null"。然后将 sqlVar 传递到 SQL 字符串中? strSQL = "UPDATE tblTestDates SET tblTestDates.TestDate2 = " & sqlVar & " " & _ "WHERE (((tblTestDates.CaseID)=" & ID & "));"
  • 在没有更多信息的情况下很难在这里提出具体的建议:你能回答迪克的问题吗?
  • @DickKusleika 不,我不会在任何时候将现有日期更新为 Null。但是用户可以访问表单并在日期值可用时更新记录。我无法知道他们是否/何时想要更新特定字段。所以我想用用户表单上的所有值更新记录每次用户更新他们的案例时,无论他们在哪个用户表单字段上输入数据,都会将其发送到数据库记录。所以如果他们输入了一个日期,它的变量将被包裹在#中,但是如果他们没有在那个字段中输入一个日期,它的变量将只是“Null”

标签: sql excel vba ado


【解决方案1】:
strSQL = "UPDATE tblDECONVERSION_DATA SET tblDECONVERSION_DATA.Status = '" & _
          NewBusiness_WorkQueue.Decon_CaseStatus & "', " & _
        "tblDECONVERSION_DATA.DMS = '" & NewBusiness_WorkQueue.Decon_DMS & "', " & _
        "tblDECONVERSION_DATA.DateRecieved = " & _
           DateOrNull(NewBusiness_WorkQueue.Decon_DateRecieved) & ", " & _
        "tblDECONVERSION_DATA.WireDate = " & _
           DateOrNull(NewBusiness_WorkQueue.Decon_WireDate) & ", " & _
        "tblDECONVERSION_DATA.LastEditXID = '" & CurrUser & _
         "', tblDECONVERSION_DATA.LastEditDate = #" & Now & "# " & _
        "WHERE tblDECONVERSION_DATA.CaseID=" & ID & ";"

一个示例函数:

Function DateOrNull(v) As String
    Dim rv as String
    If IsDate(v) Then
        rv = " #" & Format(v, "mm/dd/yyyy") & "# "
    Else
        rv = " null "
    End If
    DateOrNull = rv
End Function

【讨论】:

  • 如果您使用 ADOBC 参数,这将不起作用,并且无论如何都不推荐,因为它正在为 SQL 注入开放。
猜你喜欢
  • 2015-08-08
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2021-09-28
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多