首页 > 解决方案 > 运行时“3129”更新语句

问题描述

我正在用 VBA/MS Access 编写代码,但遇到了这个错误。我想是日期。我使用的功能:

DOB = Format(DOB,"\#mm\/dd\/yyyy\#")

现在这适用于也在我的代码中运行的 INSERT sql。当我 Debug.Print 时看起来像这样

,#01/01/1900#,

我的问题是我的 UPDATE sql 语句。

"UPDATE table SET " & "DOB=" & DOB & "," & "Last_Maintain_Date=" & LastMaintainDate & _
"," & LastmaintainUser & " WHERE ID=" & ID

调试.打印

UPDATE table SET DOB=#03/01/1983#,Last_Maintain_Date="10/11/2019 2:59:47 PM",Last_Maintain_User="User Name" WHERE ID=11111111

DOB 是一个日期字段。ID 是一个数字字段,另外两个是字符串。我希望运行时错误对您的帮助不仅仅是“您的代码错误”。

标签: sqlvbams-access

解决方案


考虑使用QueryDefs在 MS Access 中支持的参数化,并有助于避免使用标点符号或连接:

Dim strSQL As String
Dim qdef As QueryDef

' PREPARED SQL STATEMENT WITH PARAMETERS CLAUSE (NO DATA)
strSQL  = "PARAMETERS [prmDOB] Date, [prmLastMaintainDate] Date, "_
            & "       [prmLastmaintainUser] Text, [prmID] Long;"
            & " UPDATE mytable " _
            & " SET DOB = [prmDOB], " _
            & "     Last_Maintain_Date = [prmLastMaintainDate], " _
            & "     LastmaintainUser = [prmLastmaintainUser] " _
            & " WHERE ID = [prmID]"

Set qdef = CurrentDb.QueryDefs("", strSQL)

' BIND PARAMS (NO QUOTES OR HASHTAGS)
qdef![prmDOB] = DOB                            ' ASSUMED TO BE A DATE TYPE
qdef![prmLastMaintainDate] = LastMaintainDate  ' ASSUMED TO BE A DATE TYPE 
qdef![prmLastmaintainUser] = LastmaintainUser  ' ASSUMED TO BE A STRING TYPE
qdef![prmID] = ID                              ' ASSUMED TO BE AN INT/LONG TYPE

' RUN ACTION
qdef.Execute dbFailOnError

Set qdef = Nothing

您甚至可以将上面的更新语句保存为 MS Access 存储查询并在下面引用它,完全将 SQL 从 VBA 中分离出来:

Set qdef = CurrentDb.QueryDefs("mySavedUpdateQuery")

' BIND PARAMS
qdef![prmDOB] = DOB
qdef![prmLastMaintainDate] = LastMaintainDate
qdef![prmLastmaintainUser] = LastmaintainUser
qdef![prmID] = ID

' RUN ACTION    
qdef.Execute dbFailOnError

Set qdef = Nothing

请注意,SQL 参数化是编程行业的最佳实践,它超越了 VBA 扩展到任何将 SQL 作为低级语言运行的应用程序层,包括 Java、Python、C#、PHP 等通用语言。尽管实现不同,但将 SQL 与应用程序代码分开的概念是相同的。请参阅 StackOverflow 联合创始人 Jeff Atwood 的给我参数化 SQL,或者给我死亡


推荐阅读